一、引言:
[oracle@yft yft
]$ 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
inautomatic 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場景:
1 sql>create
table jack (id int,name varchar2(10
));2
3table
created.
45 sql>
insert
into jack values(1,'a'
);671
row created.
89 sql>
insert
into jack values(2,'b'
);10111
row created.
1213 sql>
commit;14
15commit
complete.
1617 sql>
show parameter undo
1819
name type value
20--
------------------ ----------- --------------
21undo_management string auto
22 undo_retention integer90023
undo_tablespace string undo2
24 sql>
create undo tablespace undo1 datafile '
'size 1m;
2526
tablespace created.
2728 sql>
alter system set undo_retention=1;
2930
system altered.
3132 sql>
varx refcursor
33 sql>
begin342
open :x for
select
*from
jack;353
end;364
/3738 pl/sql procedure
successfully completed.
3940 sql>
begin412
for i in
1 .. 20000
loop423
update jack set id=id+1;
434commit;44
5end
loop;456
end;467
/4748 pl/sql procedure
successfully completed.
4950 sql>
:x51
error:
52 ora-
01555: snapshot too old: rollback segment number
17with
name
53"_syssmu17_2039231318$" too small
5455
5657 no rows selected
四、第1種情況解決的辦法:
(1)、增加undo表空間大小;
(2)、增加undo_retention時間,預設只有15分鐘;
(3)、優化出錯的sql,減少查詢的時間,首選方法;
(4)、避免頻繁的提交。
關於Oracle ORA 01555快照過舊的錯誤
關於oracle ora 01555快照過舊的錯誤 首先了解oracle在什麼情況下會產生ora 01555錯誤 1 在1點鐘,使用者a發出了select from testdb 此時不管將來testdb怎麼變化,正確的結果應該是使用者a會看到在1點鐘這個時刻的內容。2 在1點30分,使用者b執行了...
Error ORA 01555 快照過舊
錯誤資訊 error ora 01555 快照過舊 回退段號47 名稱為 syssmu47 1286521707 過小 可能原因 sql語句執行時間太長,或者undo表空間過小,或者事務量過大,或者過於頻繁的提交,導致執行sql過程中進行一致性讀時,sql執行後修改的前映象 即undo資料 在und...
原創 ORA 01555 快照過舊
問題描述 在執行下面語句時曝出了標題所示的錯誤ora 01555。insert into super.sb kpxx com select from super.sb kpxx a where kprq to date 20130101 yyyymmdd and kprq to date 20131...