關於resetlogs和incanation的理解

轉自:http://book.51cto.com/art/200912/170082.htm

執行了不完全恢復操作,或者使用了備份的控制文件進行恢復,或者執行Flashback Database操作之後,在打開數據庫時必須指定RESETLOGS選項,這是由Oracle自身特性決定的。

正常運行中Oracle內部有一個生命週期,這種生命週期在Oracle中也有一個專業詞彙,叫incarnation。不完全恢復,顧名思義就是隻恢復部分數據,由於已經無法將數據庫恢復到當前狀態(崩潰前的狀態),Oracle數據庫也不知道當前處於什麼狀態了,事務上也許一致,但是不是最新,Oracle自己無從判斷,後續也許仍有重做日誌文件,但卻無法應用(或DBA不允許應用)。如果沒有Incarnation的概念,正常Open數據庫的話又會產生重做日誌文件,並且這些日誌文件的序號與之前相同(但內容可能不同),這樣不管是備份還是恢復都會造成混淆,因此必須在執行不完全恢復後,標示之前生命週期結束,方法就是以RESETLOGS方式打開數據庫。以RESETLOGS方式打開後,Oracle數據庫又開始了一個新的生命週期,即重置Incarnation,日誌文件序號也被重新初始化到1。

圖7-4顯示了一次OPEN RESETLOGS的操作。如果我們畫一個時間軸的話,不完全恢復就是將數據庫恢復到從備份時間到當前時間之間的某一個點。

數據庫在日誌文件序號爲1000時創建了備份,在日誌文件序號爲4000時崩潰,由於日誌文件序號爲2501,因此你只能將數據庫恢復到日誌文件序號爲2500時的狀態,然後以RESETLOGS方式打開,Oracle數據庫又開始了一個新的Incarnation,日誌文件序號被重新初始化到1,然後隨着數據庫的運行不斷增加並達到4000,但這些日誌文件與之前的日誌文件並不關聯(雖然文件序號相同)。

指定RESETLOGS會執行下列操作:

歸檔當前的在線重做日誌文件(如果能訪問到的話),然後清空內容並將日誌文件序號重置爲1(如果在線重做日誌文件不存在,則重建)。

重置控制文件中關於在線日誌文件的元數據。

更新數據文件和在線重做日誌文件中的RESETLOGS SCN和重置時間信息。

在10g之前的版本,數據庫執行完OPEN RESETLOGS操作之後,都建議立刻進行一次完全備份,因爲之前版本中在執行OPEN RESETLOGS操作時並不對當前的Online Redologs文件進行歸檔,這會導致歸檔文件不再連續,因此之前創建的備份不再有效(恢復不到當前狀態了,只能恢復到OPEN RESETLOGS操作之前)。10g及之後版本就不存在這個問題了,OPEN RESETLOGS操作會首先將當前在線重做日誌文件歸檔(如果能夠訪問到的話),並且OPEN RESETLOGS操作也會記入Online Redologs文件並正常歸檔(在10g後log_archive_format初始化參數必須包含%s%t 和 %r,以確保生成的歸檔重做日誌名稱唯一,10g能做穿越incarnation的恢復,所以要加%r,代表的是resetlog  id)
,相當於OPEN RESETLOGS只是一個命令操作,就像其他SQL命令一樣,這樣保證了歸檔日誌文件的連續性,之前的備份依然有效,不過三思仍然建議執行OPEN RESETLOGS操作之後馬上進行一次全庫備份。

提示

什麼是Incarnation?

Oracle數據庫的Incarnation在有些資料中譯作對應物,在我看來可以將其理解成生命週期。Oracle數據庫從創建到遇到RESETLOGS操作爲一個生命週期,這個生命週期內數據庫的邏輯屬性,如SCN、日誌文件序列號等具有相同的特徵。當通過OPEN RESETLOGS方式打開數據庫後,原生命週期即宣告結束,原生命週期中生成的重做日誌文件也被廢棄,日誌文件序號自動重置爲1



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章