【翻譯自mos文章】使用aum( Automatic Undo Management) 時遇到 ORA-01555錯誤--- 原因和解決方案。,aumora-01555
使用aum( Automatic Undo Management) 時遇到 ORA-01555錯誤--- 原因和解決方案。
參考原文:
ORA-01555 Using Automatic Undo Management - Causes and Solutions (Doc ID 269814.1)
適用於:
Oracle Database - Enterprise Edition - Version 9.0.1.0 and later
Information in this document applies to any platform.
目的:
本文討論了當使用Automatic Undo Management 時(以下簡稱AUM)特性時,
一個查詢返回ora-01555 "snapshot too old (rollback segment too small)" 錯誤的各種情境以及對該錯誤的各種解決方案
範圍:
本文讓使用者體會下列錯誤:
ORA-1555: snapshot too old (rollback segment too small)
細節:
Checked for relevance on 26-Mar-2012
對於ora-01555錯誤,有很多原因。
當使用諸如 在oracle 8i或者更低版本中的 老rollback segments 管理方法時,其原因和解決方案在 Document 1005107.6 and Document 45895.1中。
這些原因和解決方案依然適用於oracle 9i及其更高版本,當解決ora-01555錯誤時,這些方法應該被考慮。
本文檔的焦點在於oracle 9i或者更高版本情況下,當使用AUM特性時的ora-01555錯誤。
UNDO_RETENTION
若是UNDO_RETENTION參數設定的不合適,會導致ora-01555錯誤。Retention 是以秒為單位指定的。這個參數決定了undo retention的 低閾值(threshold )。
oracle 會儘力保留undo ,至少保留到該參數指定的時間。 The UNDO_RETENTION 參數只有在當前 undo資料表空間足夠的情況下才會被使用(is only honoured )。
如果一個active的事務需要undo 空間,並且undo資料表空間沒有閒置空間,然後oracle啟動 回收 unexpired undo space 的工作。這會導致一些查詢失敗,並報錯ora-01555錯誤。
當需求產生時,一個新的extent 將會從undo tablespace中被分配,但是我們會盡量的將這種分配行為延遲。
在10.2.x及其更高版本中,使用extent的順序如下:
1. 當undo 資料正在被寫入到一個undo segment時,如果undo 資料已經到達當前extent的末尾,並且下一個extent包括 expired 的undo,
那麼新的undo 資料(由當前事務產生的undo資料)將會 使用(wrap into)expired 的undo,而不是從 the undo tablespace free extent pool 中抓取 free的 extent。
新的extent空間不會被分配。
2.需要擴充undo segment的話,我們首先會尋找undo tablespace內的空閑空間,而不是去擴充datafile,不論datafile的AUTOEXTEND 屬性是否設定。
注意:本步驟在有些情況下被違反(broken),該bug在 9205 或者更高版本中被修複。
3. 如果我們暗示(hint)去收縮任何的undo segment以釋放空間,然後我們去做了,然後看一下釋放的空間是否滿足我們的需要。
4.下一步,我們首先尋找offline的segment 作為能reuse的 expired extents ,如果我們知道所有的offline的segment 都沒有空間,那麼我們會跳過本步。
5.我們是否能從其他online 的segment 中偷取 任何的 expired 的extent
6.如果資料表空間中有任何一個自動擴充的datafile,那麼我們會在資料表空間中擴充資料檔案以 分配空間。如果資料表空間中沒有自動擴充的datafile,則跳過本步
7.如果retention 被保證,我們不能自動調優undo,然後我們會拋出一個錯誤。
8. 我們嘗試使用一個低的UNDO_RETENTION 值,來確認 :
我們能否在不必違反任何retention guarantee的情況下(通過doing any hinted shrinking of segments) 釋放一些空間
9.如果我們依然沒有空間,並且正在保證 retention(are guaranteeing retention ),那麼一個錯誤被拋出。
10.我們使用的是自動調優(auto tuned)並且不能保證(guaranteed)。我們開始此嘗試從offline 的segment中偷取 UNEXPIRED extents
11.嘗試把 從undo segment 分配的UNEXPIRED space 分配給當前 事務(transaction)
12.嘗試從其他的online的segment中偷取 UNEXPIRED space。
注意:在一個特定並且罕見情況下,oracle可能不會重用(reuse) unexpired extents ,然後會報 ORA-30036 error
解決方案:
1. undo tablespace 太小,增大undo 資料表空間的大小。undo 資料表空間應該足夠大,以滿足儲存 活動事務所產生的undo data 和 保持 honor the undo retention setting.
2.最佳化 UNDO_RETENTION 參數值。這對於系統中運行大的查詢 十分重要。此參數值應該至少等於最長啟動並執行那個查詢的時間長度。
只要資料已經運行了一段時間,這個參數值可以通過查詢V$UNDOSTAT視圖來確定:
SQL> select max(maxquerylen) from v$undostat;
V$UNDOSTAT 視圖以10分鐘為間隔保留 udno 統計資訊,
這個視圖按照instance 展示統計資料,例如 begin time, end time,對於每一個執行個體來說,統計值是一個唯一的間隔
該視圖包括如下列:
Column name Meaning
BEGIN_TIME 區間檢查的開始時間
END_TIME 區間檢查的結束時間
UNDOTSN undo 資料表空間號
UNDOBLKS 在間隔期間內使用的undo block的總數
TXNCOUNT 在間隔期間內的事務總數
MAXQUERYLEN 在間隔期間內的一個查詢最大的期間(以秒為單位)
MAXCONCURRENCY 在間隔期間內,最高的事務數
UNXPSTEALCNT -----當 unexpired blocks 從其他 undo segments 中被偷取以滿足空間需求的嘗試次數。
UNXPBLKRELCNT 從undo segment 中remove掉用於其他事務的 unexpired blocks 數量。
UNXPBLKREUCNT 被事務重用(reuse)的unexpired undo blocks的 數量
EXPSTEALCNT 當expired extents 從其他 undo segments 中被偷取以滿足空間需求的嘗試次數。
EXPBLKRELCNT expired extents的數量,這些 expired extents 從其他 undo segments 中被偷取以滿足空間需求
EXPBLKREUCNT -----在同一個undo segment中被重用的 expired undo blocks 的數量。
SSOLDERRCNT 在間隔期間 ora-1555錯誤發生的次數。
NOSPACEERRCNT Out-of-Space errors的個數。
當UNXPSTEALCNT 列通過 EXPBLKREUCNT列 持有了一個非零值,這是空間壓力的一個標誌。
如果列SSOLDERRCNT 非零,那麼UNDO_RETENTION 沒有被正確設定。
如果列NOSPACEERRCNT非零,那麼有 相當嚴重的空間問題。
3. oracle10g中,有一個 guaranteed undo retention 選項。當此選項 被啟用,資料庫永遠不會覆蓋unexpired undo data。
比如,undo data的 存在時間小於 undo retention 期間。
務必保證undo tablespace 足夠大,以滿足guarantee requirement。
你可以啟用 guarantee option ,
啟用方法是當建立undo tablespace的時候 為undo tablespace 指定RETENTION GUARANTEE 子句
或者 使用alter tablespace 語句:
SQL> alter tablespace undotbs1 retention guarantee;
4.需要的空間依賴於 特定期間內需要的undo block數量,它是與UNDO_RETENTION 呈線性關係。
使用Document 262066.1 提到的公式來計算undo tablespace的大小。
注意:關於oracle 10gR2,Enterprise Manager裡邊有一個undo advisor,使用Enterprise Manager,你可以管理undo
a)From the Database Control home page, click Administration. The Administration property page appears.
b)In the Database Configuration section, click Undo Management. You can use the Undo Management page to view the following about your undo configuration:
■Name and size of undo tablespace
■Auto-extend tablespace setting
■Auto-tuned undo retention period
■Minimum retention period
See the Oracle Database 2 Day DBA manual for more details.