设为首页 收藏本站
查看: 689|回复: 0

[经验分享] Oracle读书摘录2---多版本、数据锁定和闪回

[复制链接]

尚未签到

发表于 2016-8-5 12:49:11 | 显示全部楼层 |阅读模式
  

  1. 以下是对Oracle 锁定策略的总结:
  Oracle 只在修改时才对数据加行级锁。正常情况下不会升级到块级锁或表级锁(不过两段提
  交期间的一段很短的时间内除外,这是一个不常见的操作)。
  如果只是读数据,Oracle 绝不会对数据锁定。不会因为简单的读操作在数据行上锁定。
  
  
  2.Oracle 数据库中有两个非常重要的概念。多版本(multi-versioning)一词实质上指Oracle 能够从
  数据库同时物化多个版本的数据。
  
  


ops$tkyte@ORA10G> create table t
2 as
3 select *
4 from all_users;
Table created.
ops$tkyte@ORA10G> variable x refcursor
ops$tkyte@ORA10G> begin
2 open :x for select * from t;
3 end;
4 /
PL/SQL procedure successfully completed.
ops$tkyte@ORA10G> delete from t;
28 rows deleted.
ops$tkyte@ORA10G> commit;
Commit complete.
ops$tkyte@ORA10G> print x
   
  在前面的例子中,我创建了一个测试表T,并把ALL_USERS 表的一些数据加载到这个表中。然后在这
  个表上打开一个游标。在此没有从该游标获取数据,只是打开游标而已。
  注意要记住,Oracle 并不“回答”这个查询。打开游标时,Oracle 不复制任何数据,你可以想想看,
  即使一个表有十亿条记录,是不是也能很快就打开游标?没错,游标会立即打开,它会边行进边
  回答查询。换句话说,只是在你获取数据时它才从表中读数据。
  在同一个会话中(或者也可以在另一个会话中;这同样能很好地工作),再从该表删除所有数据。甚
  至用COMMIT 提交了删除所做的工作。记录行都没有了,但是真的没有了吗?实际上,还是可以通过游标获
  取到数据。OPEN 命令返回的结果集在打开的那一刻(时间点)就已经确定。打开时,我们根本没有碰过表
  中的任何数据块,但答案已经是铁板钉钉的了。获取数据之前,我们无法知道答案会是什么;不过,从游
  标角度看,结果则是固定不变的。打开游标时,并非Oracle 将所有数据复制到另外某个位置;实际上是
  DELETE 命令为我们把数据保留下来,把它放在一个称为undo 段(undo segment)的数据区,这个数据区
  也称为回滚段(rollback segment)。
  
  
  3.多版本和闪回
  考虑以下例子。首先得到一个SCN,这是指系统修改号(System Change Number)或系统提交号
  (System Commit Number);这两个术语可互换使用。SCN 是Oracle 的内部时钟:每次发生提交时,这个
  时钟就会向上滴答(递增)。实际上也可以使用日期或时间戳,不过这里SCN 很容易得到,而且相当准确:
  
  


SQL> var scn number            --定义一个记录scn的变量
SQL> exec :scn :=dbms_flashback.get_system_change_number  --赋值
PL/SQL procedure successfully completed.
SQL> print scn   --打印输出当前的scn号
SCN
----------
7645939
SQL> delete from t;
30 rows deleted.
SQL> commit;
Commit complete.
SQL> flashback table t to scn :scn;  --闪回表数据到删除之前的状态
flashback table t to scn :scn
*
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enable
   
  /****注意如果你得到一个错误“ORA-08189: cannot flashback the table because row movement is not
  enabled using the FLASHBACK command”(ORA-08189:无法闪回表,因为不支持使用FLASHBACK
  命令完成行移动),就必须先执行一个命令:ALTER TABLE EMP ENABLE ROW MOVEMENT。这个命令
  的作用是,允许Oracle 修改分配给行的rowid。在Oracle 中,插入一行时就会为它分配一个rowid,
  而且这一行永远拥有这个rowid。闪回表处理会对EMP 完成DELETE,并且重新插入行,这样就会
  为这些行分配一个新的rowid。要支持闪回就必须允许Oracle 执行这个操作。****/
  
  


SQL> alter table t enable row movement;
Table altered.
SQL> flashback table t to scn :scn;
Flashback complete.
SQL> select * from t;
USERNAME                          USER_ID CREATED
------------------------------ ---------- --------------
TESTMAN                                64 27-4月 -10
BI                                     63 29-6月 -09
SH                                     61 29-6月 -09
IX                                     60 29-6月 -09
OE                                     59 29-6月 -09
HR                                     58 29-6月 -09
SCOTT                                  57 10-3月 -04
MGMT_VIEW                              56 10-3月 -04
PM                                     62 29-6月 -09
WKPROXY                                51 10-3月 -04
WKSYS                                  50 10-3月 -04
USERNAME                          USER_ID CREATED
------------------------------ ---------- --------------
MDDATA                                 49 10-3月 -04
SYSMAN                                 54 10-3月 -04
ANONYMOUS                              43 10-3月 -04
XDB                                    42 10-3月 -04
WK_TEST                                53 10-3月 -04
OLAPSYS                                46 10-3月 -04
CTXSYS                                 40 10-3月 -04
MDSYS                                  36 10-3月 -04
SI_INFORMTN_SCHEMA                     35 10-3月 -04
ORDPLUGINS                             34 10-3月 -04
ORDSYS                                 33 10-3月 -04
USERNAME                          USER_ID CREATED
------------------------------ ---------- --------------
EXFSYS                                 32 10-3月 -04
WMSYS                                  23 10-3月 -04
DBSNMP                                 22 10-3月 -04
DMSYS                                  37 10-3月 -04
DIP                                    19 10-3月 -04
OUTLN                                  11 09-3月 -04
SYSTEM                                  5 09-3月 -04
SYS                                     0 09-3月 -04
30 rows selected.
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253275-1-1.html 上篇帖子: oracle修改表空间属性并且解决ORA-01658 下篇帖子: ORA-01033: ORACLE initialization or shutdown in progress 解决办法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表