全解ORA-1555快照太舊錯誤原理及解決方案


 

第一章 DBA及開發必備】全解ORA-1555快照太舊錯誤原理及解決方案

DBAplus社群 | 2016-02-24 06:47

不論你的工作是管理Oracle數據庫,還是開發、維護Oracle上的應用程序,通常來講你都遇到過ORA-01555:snapshot too old這樣的錯誤。本文為你詳解錯誤產生的原因以及最佳解決方案。

ORA-01555產生的過程

我們先來看看ORA-01555是怎樣產生的:

wps155F.tmp

錯誤記錄在哪?

通常,這個錯誤可能會在以下文件中出現:

1Alert 告警日志文件

報錯信息類似:

ORA-01555: snapshot too old: rollback segment number 107 with name "_SYSSMU107_1253191395$" too small

2問題發生時的跟蹤日志文件

默認情況,ORA-01555錯誤發生時不會自動生成跟蹤日志文件。但是可以在系統里設置下面的事件,讓它在錯誤發生時同時生成:

alter system set events '1555 trace name errorstack level 3';

設置了1555事件后,一旦錯誤發生,就會生成相應的日志文件,類似如下:

wps1570.tmp

錯誤因何而來?

產生ORA-01555錯誤的根本原因是由於UNDO塊被覆蓋,查詢語句不能獲取到查詢語句發起時刻所構造的數據副本。

已知的一些原因如下:

1相應行數據的UNDO記錄已經過期了

這里說的過期是當前時間(指錯誤發生時)離數據提交時間已經超過UNDO_RETENTION設定的值。一旦已提交的記錄對應的UNDO記錄是“expired”狀態,就表明這部分空間可以重用,數據可以被覆蓋了。

你可能會問,為什么有時候我們遇到ORA-01555錯誤時,查詢語句運行時間比UNDO_RETENTION要長很多,有時候卻短很多呢?這沒什么明確的答案。

要看具體問題發生時UNDO表空間有多忙,系統負載有多大。

提示:一個活動或者未提交的事務對應的UNDO記錄會被標記為“ACTIVE”狀態。一旦事務被提交,相應的UNDO記錄被標記為“UNEXPIRED”,它將持續一段時間(這段時間由UNDO_RETENTION參數決定,如果使用了自動還原段管理,那是由TUNED_UNDORETENTION決定,該參數的值系統自動評估),過了這一時間后,這一UNDO記錄被標記為“EXPIRED”,該空間可被重用。

2相應行數據的UNDO記錄狀態並非過期,但仍然被覆蓋了

發生這種情況有2個必要條件:

對UNDO表空間沒有設置RETENTION GUARANTEE

UNDO表空間滿了

這個時候,“UNEXPIRED”狀態的UNDO記錄就可能被覆蓋了。

3LOB段的LOB段的讀一致性副本不再可用

依賴於LOB字段是怎樣配置的,in-row還是out-of-row,in-row方式的LOB字段在UNDO表空間中采用跟普通行一樣的UNDO算法。

Out-of-row方式的LOB字段不一樣,它的讀一致性副本有下面2種控制方式:

1)老的方式:PCTVERSIOIN

這個參數關系到LOB數據的一致讀,指的是表lob字段所在的表空間需要預留給lob的前映象使用的最大百分比,默認值是10。也就是說,只要使用不超過10%,LOB字段的前映像的數據是不會被覆蓋的。

2) 新的方式(自動還原段管理使用):RETENTION

Oracle用UNDO_RETENTION參數來決定在數據庫中保留多少已經提交的UNDO數據。這種方式LOB段跟普通段使用相同的過期策略。

在這種方式中,用LOB字段的語句發生ORA-1555的話,意味着:

LOB字段的前映像的使用已經超過PCTVERSION,讀一致性數據被覆蓋。

或者,LOB字段前映像超過了RETENTION的值,在查詢發生時一些行的LOB字段前映像已經被覆蓋,於是ORA-1555觸發。

解決方案

1檢查錯誤日志信息

通過檢查告警日志,或者包含ORA-1555錯誤信息的跟蹤日志,可以更詳細的看到具體的錯誤類型:

1)提示回滾段太小

錯誤提示:

ORA-01555: snapshot too old: rollback segment number with name "" too small(注意!!!這里的回滾段名字是空的)

或者,

ORA-22924: snapshot too old

這種錯誤說明是訪問的UNDO數據是LOB字段類型。LOB字段訪問遇到ORA-1555錯誤通常是下面幾個原因導致的:

LOB段損壞

參考MOS文檔檢查是不是這個問題:

Document 452341.1 ORA-01555 And Other Errors while Exporting Table With LOBs, How To Detect Lob Corruption

如果沒有LOB損壞,檢查Retention/Pctversion值是不是合適

參考MOS文檔,確認是不是需要調高Retention/Pctversion:

Document 846079.1 LOBs and ORA-01555 troubleshooting

ORA-01555: snapshot too old: rollback segment number 107 with name "_SYSSMU107_1253191395$" too small

注意,這個錯誤提示跟上面不一樣。"_SYSSMU107_1253191395$"表示UNDO數據是在UNDO表空間的。

這個ORA-1555錯誤報告是在訪問UNDO表空間的UNDO數據時發生錯誤的,用后續的方法來診斷問題。

2)查詢耗時太長

在一些ORA-1555錯誤發生時,會在alert日志或者是應用日志中出現查詢失敗時耗時(Duration)的秒數:

ORA-01555 caused by SQL statement below (Query Duration=1974 sec, SCN: 0x0002.bc30bcf7):

如果發現錯誤日志中,duration=0或者耗時很短,查看下面的文檔:

Document 1131474.1 ORA-01555 When Max Query Length Is Less Than Undo Retention, small or 0 Seconds

如果查詢耗時超過UNDO_RETENTION值,可以考慮加大UNDO_RETETION,同時要記得調整UNDO表空間大小。

如果查詢耗時等於或者接近UNDO_RETENTION,繼續看后面的文字。

2檢查UNDO數據文件

wps1571.tmp

如果UNDO數據文件沒有關閉自動擴展功能,可能會導致TUNED_UNDORETENTION值被計算得很高,因此UNDO空間分配是偏向於更多的空間。那怎么破呢?使用UNDO數據文件自動擴展功能,即使存儲可用空間足夠的時候也帶上MAXSIZE。

注意:強烈建議,不要讓UNDO表空間里同時存在關閉自動擴展功能的UNDO數據文件和打開自動擴展功能的UNDO數據文件,因為這會導致TUNED_UNDORETENTION計算錯亂。

3檢查 TUNED_UNDORETENTION

wps1581.tmp

1)TUNED_UNDORETENTION比MAXQUERYLEN小

這種情況表明UNDO表空間有空間上的壓力,實際保留的UNDO記錄比理論上的要少。

解決辦法是擴大UNDO表空間。

2)TUNED_UNDORETENTION比MAXQUERYLEN大很多

通常發生在UNDO表空間的數據文件關閉自動擴展選項的情況下。內部的算法是盡可能久的保持UNDO記錄,因此TUNED_RETENTION的值就會比較高。

解決辦法是把所有的UNDO數據文件設置為自動擴展,並且加上MAXSIZE選項。

長時間運行的查詢語句也會把TUNED_RETENTION的值搞得很高。這種情況。就要優化SQL語句來避免保留過多UNDO數據在UNDO表空間了。

通過下面的語句來識別哪些查詢語句耗時較久:

wps1582.tmp

3)狀態為ACTIVE/UNEXPIRED的UNDO占比很高

wps1583.tmp

下面的幾種情況可能會產生大量ACTIVE/UNEXPIRED狀態的UNDO:

UNDO_RETENTION或TUNED_UNDORETENTION值很大

在某個特定時間點產生了大量UNDO數據。用下面的語句診斷:

wps1584.tmp

大量的死事務回滾

使用了閃回數據查詢

關於狀態為ACTIVE的UNDO的信息,可以參閱:

Document 1337335.1 How To Check the Usage of Active Undo Segments in AUM

4UNDO_RETENTION

建議將UNDO_RETENTION的值至少設置為MAXQUERYLEN的一半。如果發生了ORA-1555錯誤,則適當調大。

到此,基本上涉及ORA-01555錯誤的原理和診斷就說完了。

About Me

....................................................................................................................................................

本文來自於微信公眾號轉載文章,若有侵權,請聯系小麥苗及時刪除

ITPUB BLOG:http://blog.itpub.net/26736162

QQ:642808185 若加QQ請注明您所正在讀的文章標題

【版權所有,文章允許轉載,但須以鏈接方式注明源地址,否則追究法律責任】

....................................................................................................................................................


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM