Ora-1555 snapshot too old 原因及解决方法

ORA-01555的成因
参考自Doc ID:  40689.1
1 回滚信息已经被重写,所以Oracle不能回退事务记录到足够老的版本(来满足一致读)。
2 存储在回滚段头部的事务表的事务槽,Oracle不能找到原有的事务槽。

 


1 Session 1 在时间T1查询并且此时SCN为50
2 Session 1 在这次查询中需要查询块B1的数据
3 Session 1 在SCN为51的时候修改这个块
4 Session 1 做一些其他的操作来产生回退信息
5 Session 1 提交在3 4步步骤 (现在其他的事务可以覆盖这些回退信息了)
6 Session 1 重新访问同一个块B1 也许现在已经不同了。

现在Oracle在扫描块的头部时发现它修改的时间要晚于查询的时间(QENV 50).因为我们需要获得在QENV 50这一时刻该块的镜像。

如果在buffer cache能找到一个足够旧的版本,那就使用这个版本,否则就需要回退当前块,来产生一个在查询开始时的版本

在这种情况下,如果因为Session1产生的回退信息,覆盖了回退所需要的信息,那么就返回ORA-1555错误。

 


1 Session 1 开始查询在T1此时 QENV为50
2 Session 1 在这次查询中需要查询块B1的数据
3 Session 1 在SCN为51的时候修改了这个块
Session 1 commits the changes (Now other transactions are free to overwrite this rollback information)
4 session  1 提交了这些改变(现在其他的事务可以覆盖这些回退信息了)
5 另外一个Session 或者许多其他的Session 在一系列的提交事务中使用相同的回滚段。
  每一个事务都要消耗一个回滚段的事务表的事务槽,终于完成一次循环,(事务槽是被循环使用的),重写了所有的事务槽。请注意,事务提交后,其所在事务槽就可以被重用。
6 Session 1的查询访问了在其发出查询命令后已经修改的块。因此Oralce需要得到一个在那个时间点的块的镜像。


接下来Oracle试图查看这个数据块头部的事务槽指向的回滚段的事务槽信息。之后,发现这个事务槽已经被覆盖并且试图回退对回退段头部的改变,来获得原始的记录。


如果不能充分的回退回退段事务表的,就会返回ORA-155因为Oralce再也不能得到需要的数据块的版本。

It is also possible to encounter a variant of the transaction slot being overwritten when using block cleanout. This is briefly described below: 
也有可能由遇到一个事务槽覆盖的变体,当使用块清除时。可以简单描述如下:
Session1 在QENV 50开始查询。之后,另外一个进程修改了Session1将要访问的块。当Session 1遇到这些块时,它测定这些块已经被改变,但是并没有写到数据文件中。Session 1 必须确定这些行在QENV 50是否存在,后来是否被改变。

为了达到以上目的,Oracle必须查看相关的回滚段的事务表的事务槽来测定提交SCN。如果这个SCN, 比QENV 晚,那么Oracle必须创建一个更老版本块,如果这个SCN在QENV前,那么这个块就需要被clean out。

如果这个事务槽已经被覆写并且这个事务表不能被恢复到足够旧, 那么Oracle不能得到块镜像并且返回ORA-1555.

一般来说,Oracle可以使用一个法则来测定块的SCN,即使回滚段槽已经被覆写。但是,在这个案例中,Oracle不能保证在查询开始后,这个块的版本没有被改变。


解决方法

这里列出了一些方法来避免这篇文章讨论的ORA-01555错误。他解决了回滚段信息被同一个session覆写和回滚段事务表
被覆写。


Case 1 - Rollback Overwritten

.
1 增加回滚段大小以减小覆写回滚信息的可能
2 减小提交次数,理由同1
3 只处理表的一段信息,而不是整张表,理由同1
5 增加额外的回滚段。这能允许修改等等。通过访问更多的回滚段,来减小覆写所需回退信息的目的。
If fetching across commits, the code can be changed so that this is not done.
5 如果通过Commit 提取,编码可能会被改变,这样的情况并非如此
6 确认在不同的处理过程中,外部查询不会重新访问相同的块。下面两种方法可以实现:

1 使用全表扫面 而不是通过索引查询
2 引入虚拟排序机制,即找到所有数据,排序然后从而访问同一个块。


Case 2 - Rollback Transaction Slot Overwritten
回退事务槽被重写

 

 

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

转载于:http://blog.itpub.net/12474069/viewspace-615878/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值