關於oracle ora-01555快照過舊的錯誤
首先了解oracle在什麼情況下會產生ora-01555錯誤:
1、在1點鐘,使用者a發出了select * from testdb;此時不管將來testdb怎麼變化,正確的結果應該是使用者a會看到在1點鐘這個時刻的內容。
2、在1點30分,使用者b執行了update命令,更新了testdb表中的第4100萬行的這條記錄,這時,使用者a的全表掃瞄還沒有到達第4100萬條。毫無疑問,這個時候,第4100萬行的這條記錄是被寫入了回滾段,假設是回滾段undots1,如果使用者a的全表掃瞄到達了第4100萬行,是應該會正確的從回滾段undots1中讀取出1點鐘時刻的內容的。
3、這時,使用者b將他剛才做的操作提交了,但是這時,系統仍然可以給使用者a提供正確的資料,因為那第4100萬行記錄的內容仍然還在回滾段undots1裡,系統可以根據scn到回滾段裡找到正確的資料,但要注意到,這時記錄在undots1裡的第4100萬行記錄已經發生了重大的改變:就是第4100萬行在回滾段undots1裡的資料有可能隨時被覆蓋掉,因為這條記錄已經被提交了!
4、由於使用者a的查詢時間漫長,而業務在一直不斷的進行,undots1回滾段在被多個不同的transaction使用著,這個回滾段裡的extent迴圈到了第4100萬行資料所在的extent,由於這條記錄已經被標記提交了,所以這個extent是可以被其他transaction覆蓋掉的!
5、到了1點45分,使用者a的查詢終於到了第4100萬行,而這時已經出現了第4條說的情況,需要到回滾段undots1去找資料,但是已經被覆蓋掉了,這時就出現了ora-01555錯誤。
↑↑以上此段非本人原創
原因分析:"報表"程式執行時間漫長,在程式查詢的過程中其他使用者對"報表"進行了更新,被更新的資料寫入了回滾段,當程式到回滾段找資料時,發現資料已經被覆蓋掉,於是就出現了ora-01555錯誤。另外"報表"程式執行效率不高也會造成ora-01555錯誤。
解決辦法:
1、擴大回滾段,因為回滾段是迴圈使用的,如果回滾段足夠大,那麼那些被提交的資料就能儲存足夠長的時間,使那些大事務完成一致性讀取。之前ebs系統undo表空間為9gb,目前為10gb。見下圖:
2、增加undo_retention時間,因為undo回滾段是迴圈使用,裡面的資料可能隨時被迴圈覆蓋掉,如果設定undo_retention時間更長,那麼在retention規定的時間內,任何其他事務都不能覆蓋這些資料。目前ebs系統undo_retention為10800秒(3個小時)。見下圖:
3、最重要的一點就是優化程式相關查詢語句,減少查詢語句的一致性讀,降低讀取不到回滾段資料的風險。所有的出錯資訊都會紀錄到資料庫日誌alert_prod.log檔案中,下圖紅線部分是一條sql查詢詞句,ora-01555很有可能是這條語句造成,把這條語句提供給開發人員來分析和優化程式**。
alter system set undo_retention=10800 scope=both;
Oracle ORA 01555 快照過舊
一 引言 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 rea...
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...