oracle undo管理

winston_DBA發表於2015-03-22
1.概念介紹
UNDO是Oracle中的一個很重要的機制,在對資料庫進行修改的時候,Oracle會將資料塊上修改之前的資料(稱為前映像,before image)儲存在回滾段中,這樣當我們需要進行回滾(rollback)的時候就很容易能從回滾段中將之前的資料取出來將資料塊上面的資料還原回來。

2.主要用途

資料回滾(rollback)
資料庫恢復(data recovery) :例項恢復,即在資料庫意外當機之後需要使用UNDO資料進行回滾操作。
一致性讀(read consistency)
閃回功能(Flashback):Flashback Query, Flashback Drop等(flash database除外)。

3.UNDO引起常見問題:

(1).空間使用率100%,導致DML操作無法進行。
(2).告警日誌中出現大量的ORA-01555告警錯誤。
(3).例項恢復失敗,資料庫無法正常開啟。

4.目前UNDO管理方法有手工管理和自動管理兩種方式,主要演進過程如下:

Oracle 9i之前的版本:手工UNDO管理,DBA要手工建立UNDO段提供給UNDO使用,比較麻煩。
Oracle 9i :引入自動UNDO管理,Oracle可以利用現有的UNDO表空間自動進行UNDO資訊和空間的管理,然後透過指定UNDO RETENTION來決定非活動但未過期UNDO資訊的保留期限。
Oracle 10g:引入自動RETENTION最佳化,可以根據UNDO表空間的大小以及自動增長的情況自動的最佳化UNDO RETENTION,最大限度的利用UNDO空間來避免ORA-1555之類的錯誤產生。
Oracle 11g:使用DBCA建立資料庫時候預設使用自動UNDO管理。

5.自動UNDO管理

自動UNDO管理(Automatic UNDO Management, AUM)是Oracle從9i開始推出的新UNDO管理方式,之前的UNDO管理都是靠手工建立UNDO段來完成的。有了AUM之後,Oracle可以在UNDO表空間當中自動的管理UNDO資訊和UNDO所佔用的空間,在無需人工參與空間分配等活。
與AUM相關的兩個最基本的引數就是UNDO_MANAGEMENT和UNDO_TABLESPACE。
UNDO_MANAGEMENT
決定了使用自動(AUTO)還是手動(MANUAL)的UNDO管理方式,從11g開始在初始化引數中如果沒有指定UNDO_MANAGEMENT參數,預設情況下是使用自動UNDO管理,Oracle自身也是推薦使用AUM。11g之前的版本則預設使用手動。
UNDO_TABLESPACE
指定了Oracle該在那個UNDO表空間中建立自動管理的UNDO段。UNDO_TABLESPACE的選擇方法如下:
如果系統中不存在UNDO表空間,則資料庫開啟時自動選用使用SYSTEM表空間。
如果系統中存在多個UNDO表空間,預設情況下資料庫開啟時使用第一個可用的UNDO表空間。
在系統執行中如果不設定UNDO_TABLESPACE,則事務將無法執行。

6.UNDO產生級別

UNDO是由事務產生的,或者說UNDO的產生級別是事務。
在自動UNDO管理的模式下,當開啟一個事務修改資料時,Oracle會給這個開啟的事務分配回滾段用於儲存被修改資料的前映像,在事務回滾或者是提交之前,這些分配的回滾區(一個回滾段可以分配給多個事務,因此回滾資料的狀態定義在區(extent)而非段(segment)上)的狀態稱為活動狀態(ACTIVE),處於活動狀態的的回滾區對資料的回滾有著至關重要的作用,因此是不能夠被覆蓋或者是離線(offline)的。如果存在處於活動狀態的回滾段丟失(通常是UNDO表空間損壞),這時的未完成事務將因為無法回滾而造成資料的不一致。當這個事務提交或者是回滾之後,所對應的回滾區則標記為非活動(Inactive)狀態,處於非活動狀態的回滾區不再為資料回滾或是資料庫恢復等功能所用,但是UNDO的其它諸如一致性讀和閃回等功能卻還是有可能用到這些回滾段。因此處於Inactive的回滾區也並不意味著就可以馬上丟棄,這個需要取決於UNDO的RETENTION的設定。

7.自動UNDO管理的RETENTION

UNDO管理的區有四種狀態:活動、非活動未過期、非活動已過期和未使用。
活動:事務還未提交或回滾的資料。
非活動未過期:事務已經提交,但還未超過UNDO RETENTION的資料
非活動已過期:事務已經提交,並且已經超過UNDO RETENTION的資料
未使用:UNDO表空間中未分配給事務的區空間。

當UNDO表空間設定為不可自動擴充套件時若未宣告RETENTION GUARANTEE,則UNDO RETENTION 只是一個期望值,當一個大事務將UNDO表空間中未使用和已過期狀態的區都已經分配使用,則會開始覆蓋未過期狀態的區。
當然,從10g開始,Oracle提供了UNDO自動最佳化功能,所謂的UNDO自動最佳化就是在UNDO表空間非自動增長的情況下,Oracle會根據UNDO表空間的大小來調整UNDO RETENTION的大小,自動調整RETENTION就是最大限度的利用當前UNDO表空間的可用空間,儘可能的保留最多的UNDO資料,以最大化的減少類似ORA-1555之類的錯誤發生。在這種情況下的UNDO RETENTION設定只是一個擺設,屬於基本無用的了。
經過自動最佳化後的UNDO RETENTION可以在動態檢視V$UNDOSTAT.TUNED_UNDORETENTION中看到。預設情況下,Oracle會每10分鐘往V$UNDOSTAT中插入一條當前UNDO表空間使用情況的資料,其中就包含了當時自動最佳化後的UNDO RETENTION數值。
相反,若宣告瞭RETENTION GUARANTEE,則會保證未過期的資料不會被覆蓋,但這很可能會導致事務失敗,沒有百分之百的理由支援下,建議不要這樣做。
當UNDO表空間設定為自動擴充套件,當未使用和過期的資料都已經分配完,資料庫會保證UNDO RETENTION,而去自動擴充空間,不會選擇覆蓋未過期資料。
預設情況下,retention guarantee 是禁用的。可透過語句開啟:
SQL> Alter tablespace undotbs1 retention guarantee;

注意:在企業中,一般將UNDO表空間設定為固定大小,然後利用oracle的UNDO自動最佳化功能,檢視最佳化後的undo_retention,如果該值不夠大,可以將UNDO表空間固定大小設定更大一些,這樣經過oracle最佳化後的undo_retention肯定也會變大。重複操作,直至undo_retention滿足系統業務需求即可。

文章整理自:

http://blog.itpub.net/23135684/viewspace-1065601/






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30167136/viewspace-1469023/,如需轉載,請註明出處,否則將追究法律責任。

相關文章