应用报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/