ORA-01555: snapshot too old的发生原因及解决

应用报ora-01555错误。哎呦好烦。
查了一下:
ORA-01555 snapshot too old:
    rollback segment number string with name "string" too small
Cause:
    Rollback records needed by a reader for consistent read are overwritten by other writers.
Action:
    If in Automatic Undo Management mode, increase the setting of UNDO_RETENTION. Otherwise, use larger rollback segments.

看了这个错误的产生原因,我们不难想到这样的场景:

1.一个长事务T1开始,它并没有使用表aa的一个行值(即这个行值此时并没有镜像):
2.一个短事务T2开始,对表aa的这个行值进行了修改并提交(好了,这时该行值终于有了它在T1事务之前的镜像)。这时被修改的这个值被标记为inactive,它的extents并没有立刻被回收重分配。
3.另一个短事务T3开始,这个事务恰巧把T2事务使用过的undo extents占用了。T2之前保存的镜像被覆盖了。
4.好了,这个时候T1需要这个行值在事务开始前的镜像,即T2事务开始时做的镜像,但是这个镜像已经被覆盖了。
ORA-1555: snapshot too old出现了。

这相,解决的办法不难想到了:
T3不要把T2之前的镜像覆盖或者不要出现T1那么长时间的事务不就行了?

控制T1的持续时间:
1.应用程序尽量避免巨表的漫长查询操作,改传统的cursor游标为bulk collect;
2.尽量程序中不要使用大事务量的增删改操作,同时记得及时commit;

T3不要覆盖T2之前的镜像:
加大undo表空间和加大undo的retention。

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

转载于:http://blog.itpub.net/29209660/viewspace-1416834/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值