当前位置:   article > 正文

Oracle ORA-01555(快照过旧)_ora01555

ora01555

ORA-01555 快照过旧,是数据库中很常见的一个错误,比如当我们的事务需要使用undo来构建CR块的时候,而此时对应的undo已经不存在了,这个时候就会报ORA-01555的错误。
    ORA-01555错误在Oracle 8i及之前的版本最多。从9i开始的undo自动管理,至现在的10g、11g中的undo auto tuning,使得ORA-01555的错误越来越少。但是这个错误,仍然不可避免。

 

二、出现ORA-01555错误,通常有2中情况:

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

    (2)、SQL语句执行过程中,访问到的块,在进行延迟块清除时,不能确定该块的事务提交时间与SQL执行开始时间的先后次序。这种情况很少。

三、模拟ORA-01555场景:

  1. SQL> create table jack (id int,name varchar2(10));
  2. Table created.
  3. SQL> insert into jack values(1,'a');
  4. 1 row created.
  5. SQL> insert into jack values(2,'b');
  6. 1 row created.
  7. SQL> commit;
  8. Commit complete.
  9. SQL> show parameter undo
  10. NAME TYPE VALUE
  11. -------------------- ----------- --------------
  12. undo_management string AUTO
  13. undo_retention integer 900
  14. undo_tablespace string UNDO2
  15. SQL> create undo tablespace undo1 datafile '/u01/app/oracle/oradata/yft/undo01.dbf' size 1m;
  16. Tablespace created.
  17. SQL> alter system set undo_retention=1;
  18. System altered.
  19. SQL> var x refcursor
  20. SQL> begin
  21. 2 open :x for select * from jack;
  22. 3 end;
  23. 4 /
  24. PL/SQL procedure successfully completed.
  25. SQL> begin
  26. 2 for i in 1 .. 20000 loop
  27. 3 update jack set id=id+1;
  28. 4 commit;
  29. 5 end loop;
  30. 6 end;
  31. 7 /
  32. PL/SQL procedure successfully completed.
  33. SQL> print :x
  34. ERROR:
  35. ORA-01555: snapshot too old: rollback segment number 17 with name
  36. "_SYSSMU17_2039231318$" too small
  37. no rows selected

 

四、第1种情况解决的办法:
    (1)、增加UNDO表空间大小;

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

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

    (4)、避免频繁的提交。

https://www.cnblogs.com/slgkaifa/p/6940235.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/721790
推荐阅读
相关标签
  

闽ICP备14008679号