错误原因:
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;
/