ORA-01555: 快照过旧: 回退段号 31 (名称为 "_SYSSMU31$") 过小

错误原因:

SQL语句执行时间太长,或者UNDO表空间过小,或者事务量过大,或者过于频繁的提交,导致执行SQL过程中进行一致性读时,SQL执行后修改的 前镜像(即UNDO数据)在UNDO表空间中已经被覆盖,不能构造一致性读块(CR blocks)。  这种情况最多。

解决办法:

 第1种情况解决的办法:

(1)增加UNDO表空间大小

(2)增加undo_retention 时间,默认只有15分钟     

alter  system set undo_retention=14400 ;

undo_retention这个值可以根据情况调大一些。

(3)优化出错的SQL,减少查询的时间,首选方法

(4)避免频繁的提交

还有一种情况,可能是oracle BUG,官网说法ORA-01555BUG比较多,但本地库已经升到11.2.0.4了。

__________________________________________________________________________________________________

然并卵,ORA-01555还是一次次的出现,令人崩溃!!!


有一天在PL/SQL Developer的sql窗口执行带dblink的查询,发现提交按钮和回滚按钮是高亮的,忽然想到这个是由于dblink的查询会带一个事务,而且是一个distributed transaction(分布式事务),应用端大量用到DBLINK查询会占用远程数据库的session。本地的session没有释放掉或者出现异常信息,就会导致远程数据库的session大量占用。时间久了就会报ORA-01555。


总结:
对于应用端中使用dblink之后,需要显示的用alter session close database DBLINK_NAME来关闭远程数据库的session连接,执行前必须先commit,否则会出现ORA-02080错误或者其他错误。

--close dblink method 1 :
SQL> commit;
SQL> ALTER SESSION CLOSE DATABASE LINK DBLINK_NAME;

in plsql used:
execute immediate ' ALTER SESSION CLOSE DATABASE LINK DBLINK_NAME';

or

--close dblink method 2 :
SQL> commit;
SQL> begin
dbms_session.close_database_link('DBLINK_NAME');
end;
/



版权声明:本文为gHost241原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。