ITPub博客

首页 > 数据库 > Oracle > ORA-01555: snapshot too old: rollback segment number 问题剖析下

ORA-01555: snapshot too old: rollback segment number 问题剖析下

原创 Oracle 作者:gydba 时间:2015-09-10 16:36:55 0 删除 编辑

下面接着上文介绍。

Oracle在更新数据块时,会在回滚段中记录这一更新动作,并且会产生一个SCN,在回滚段中,会有对应的一个事务ID。在事务提交前,会在数据块头记录下这个SCN,事务ID,回滚地址,如前面说的指针中。并且会在事务列表中设置一个锁,用于记录这个事务在这个数据块中产生的锁的数目,同时在对应修改的数据记录上放以一个行级锁。当事务提交时,并不会全不清除,只是在事务列表中做上相应标记,告诉后面访问该数据块的事务,那些事务已经提交了,如果发现前面的事务没有提交,并要访问的数据块记录被锁住了,就会被阻塞。否则只有清除相应的锁标志,并提交自己的锁标志,循环该动作。这就叫做延迟块清除。  

下面通过几个事务的演示来理解。
1)未更改前
这有两个事务01、02以及用于记录覆盖事务的03


2)现在更新row2,这样会在数据块头指向回滚段(5.3),标记为未提交(active)


3)接下来,提交该事务。
    随后,其再次访问数据块500,我们可以看到数据块的报头中,显示数据块未提交的更改


4)其它用户访问数据块500
   Oracle用数据块头来查询相应的回滚段事务列表,识别是否对数据块500有变更操作的记录,以反映数据块的真实状态,即执行了延迟块的清除。



总结为有以下两个原因会导致


* 回滚段信息被覆盖掉,从而导致Oracle无法回滚(提交)事务回到起始数据。
* 在回滚段的事务列表中的transaction slot被覆盖,并且Oracle无法回滚事务头,来获取原回滚段transaction slot


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30430420/viewspace-1796529/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-08-24

  • 博文量
    77
  • 访问量
    152013