Oracle的ORA-01555:snapshot too old错误

导致这个错误的一个原因:提交得太过频繁。ORA-01555与数据破坏或数据丢失毫无关系,它算得上是一个“安全”的错误,唯一的影响是:收到这个错误的查询无法继续处理。
这个错误实际上很简单,只有三个原因:
(1)undo段太小,不足以支撑系统上执行的工作;
(2)程序跨commit获取数据;
(3)块清除。
给出如下解决方案:
(1)首先,保证使用的事务“大小适当”,确保没有过于频繁的提交。
(2)加载完数据之后,使用DBMS_STATS扫描相关的对象从而完成对这些对象的清理。由于块清除是极大量的UPDATE和INSERT造成的,所以请务必在这些操作完成之后对表进行分析。
(3)允许undo表空间扩大,为之留出扩展的空间,并增加undo保持时间。



如果一个查询需要使用被覆盖的回滚段构造前镜像实现一致性读,那么此时就会出现Oracle著名的ORA-01555错误。
ORA-01555错误的另外一个原因是因为延迟块清除(Delayed Block Cleanout)。当一个查询触发延迟块清除时,Oracle需要去查询回滚段获得该事务的提交SCN,如果事务的前镜像信息已经被覆盖,并且查询SCN也小于回滚段中记录的最小提交SCN,那么Oracle将无从判断查询SCN和事务提交SCN的大小,此时出现延迟块清除导致的ORA-01555错误。


–设置UNDO自动调优,它会使的UNDO长期得不到释放
alter system set “_undo_autotune” = false scope=spfile;
–调整undo_retention保留时间
sql> alter system set undo_retention=7200; 调整为2个小时。


如果一个查询需要使用被覆盖的回滚段构造前镜像实现一致性读,那么此时就会出现Oracle著名的ORA-01555错误。
ORA-01555错误的另外一个原因是因为延迟块清除(Delayed Block Cleanout)。当一个查询触发延迟块清除时,Oracle需要去查询回滚段获得该事务的提交SCN,如果事务的前镜像信息已经被覆盖,并且查询SCN也小于回滚段中记录的最小提交SCN,那么Oracle将无从判断查询SCN和事务提交SCN的大小,此时出现延迟块清除导致的ORA-01555错误。
–设置UNDO自动调优,它会使的UNDO长期得不到释放
alter system set “_undo_autotune” = false scope=spfile;
–调整undo_retention保留时间
sql> alter system set undo_retention=7200; 调整为2个小时。


ORA-1555错的根本原因是因为oracle要保证读一致性。
解决方法就不说了,楼上各位大神都写出来了


网友“山”的回答:首先,保证使用的事务“大小适当”,确保没有过于频繁的提交。 为何提交过于频繁会导致这个错误,能否举例解释下。我至今没想明白。


导致这个错误的一个原因:提交得太过频繁。ORA-01555与数据破坏或数据丢失毫无关系,它算得上是一个“安全”的错误,唯一的影响是:收到这个错误的查询无法继续处理。
这个错误实际上很简单,只有三个原因:
(1)undo段太小,不足以支撑系统上执行的工作;
(2)程序跨commit获取数据;
(3)块清除。
给出如下解决方案:
(1)首先,保证使用的事务“大小适当”,确保没有过于频繁的提交。
(2)加载完数据之后,使用DBMS_STATS扫描相关的对象从而完成对这些对象的清理。由于块清除是极大量的UPDATE和INSERT造成的,所以请务必在这些操作完成之后对表进行分析。
(3)允许undo表空间扩大,为之留出扩展的空间,并增加undo保持时间。


