Oracle ORA-01555(快照過舊)
一、引言:
[Oracle@www.bkjia.com]$ oerr ora 01555
01555, 00000, "snapshot too old: rollback segment number %s with name \"%s\" 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 undo_retention
// setting. Otherwise, use larger rollback segments
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情境:
SQL> create table jack (id int,name varchar2(10));
Table created.
SQL> insert into jack values(1,'a');
1 row created.
SQL> insert into jack values(2,'b');
1 row created.
SQL> commit;
Commit complete.
SQL> show parameter undo
NAME TYPE VALUE
-------------------- ----------- --------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDO2
SQL> create undo tablespace undo1 datafile '/u01/app/oracle/oradata/yft/undo01.dbf' size 1m;
Tablespace created.
SQL> alter system set undo_retention=1;
System altered.
SQL> var x refcursor
SQL> begin
2 open :x for select * from jack;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> begin
2 for i in 1 .. 20000 loop
3 update jack set id=id+1;
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> print :x
ERROR:
ORA-01555: snapshot too old: rollback segment number 17 with name
"_SYSSMU17_2039231318$" too small
no rows selected
四、第1種情況解決的辦法:
(1)、增加UNDO資料表空間大小;
(2)、增加undo_retention時間,預設只有15分鐘;
(3)、最佳化出錯的SQL,減少查詢的時間,首選方法;
(4)、避免頻繁的提交。
Oracle ORA-01555 快照過舊 說明
ORA-01078 和 LRM-00109 報錯解決方案
ORA-01555超長的Query Duration時間
ORA-00471 處理方法筆記
ORA-00314,redolog 損壞,或丟失處理方法
ORA-00257 歸檔日誌過大導致無法儲存的解決辦法