第一章 【DBA及開發必備】全解ORA-1555快照太舊錯誤原理及解決方案
DBAplus社群 | 2016-02-24 06:47
不論你的工作是管理Oracle數據庫,還是開發、維護Oracle上的應用程序,通常來講你都遇到過ORA-01555:snapshot too old這樣的錯誤。本文為你詳解錯誤產生的原因以及最佳解決方案。
ORA-01555產生的過程
我們先來看看ORA-01555是怎樣產生的:
錯誤記錄在哪?
通常,這個錯誤可能會在以下文件中出現:
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事件后,一旦錯誤發生,就會生成相應的日志文件,類似如下:
錯誤因何而來?
產生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數據文件
如果UNDO數據文件沒有關閉自動擴展功能,可能會導致TUNED_UNDORETENTION值被計算得很高,因此UNDO空間分配是偏向於更多的空間。那怎么破呢?使用UNDO數據文件自動擴展功能,即使存儲可用空間足夠的時候也帶上MAXSIZE。
注意:強烈建議,不要讓UNDO表空間里同時存在關閉自動擴展功能的UNDO數據文件和打開自動擴展功能的UNDO數據文件,因為這會導致TUNED_UNDORETENTION計算錯亂。
3檢查 TUNED_UNDORETENTION
1)TUNED_UNDORETENTION比MAXQUERYLEN小
這種情況表明UNDO表空間有空間上的壓力,實際保留的UNDO記錄比理論上的要少。
解決辦法是擴大UNDO表空間。
2)TUNED_UNDORETENTION比MAXQUERYLEN大很多
通常發生在UNDO表空間的數據文件關閉自動擴展選項的情況下。內部的算法是盡可能久的保持UNDO記錄,因此TUNED_RETENTION的值就會比較高。
解決辦法是把所有的UNDO數據文件設置為自動擴展,並且加上MAXSIZE選項。
長時間運行的查詢語句也會把TUNED_RETENTION的值搞得很高。這種情況。就要優化SQL語句來避免保留過多UNDO數據在UNDO表空間了。
通過下面的語句來識別哪些查詢語句耗時較久:
3)狀態為ACTIVE/UNEXPIRED的UNDO占比很高
下面的幾種情況可能會產生大量ACTIVE/UNEXPIRED狀態的UNDO:
UNDO_RETENTION或TUNED_UNDORETENTION值很大
在某個特定時間點產生了大量UNDO數據。用下面的語句診斷:
大量的死事務回滾
使用了閃回數據查詢
關於狀態為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請注明您所正在讀的文章標題
【版權所有,文章允許轉載,但須以鏈接方式注明源地址,否則追究法律責任】
....................................................................................................................................................