Oracle中的incarnation

公司在某個機構作oracle恢復的時候,報了一個錯:數據庫

      RMAN- 00571: ===========================================================
RMAN- 00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN- 00571: ===========================================================
RMAN- 03002: failure of set command at 10/ 25/ 2010 15: 10: 03
RMAN- 20208: UNTIL CHANGE is before RESETLOGS change
後來經過查閱一些資料發現是 incarnation的問題,說到incarnation就要先說下resetlogs了,由於只有在使用alter database open resetlogs這個命令以後,incarnation纔會有做用,若是沒有使用過這個命令,那麼incarnation對咱們就沒有影響。
   alter database open resetlogs這個命令的做用是:在進行完不徹底恢復後,打開數據庫時,重置redo日誌,即將重作日誌的sequence重置爲1,數據文件使用新得scn和時間戳來標記(數據庫不徹底恢復時,在指定時間點後的scn都沒法再應用到數據庫中。Resetlog時的scn就被設成當前數據庫scn。)
由於是不徹底恢復,因此會包含沒作恢復前的日誌,而redo的日誌中包含恢復恢復點以後的日誌是對而這些日誌對於恢復後的數據庫再也不有效,因此數據庫會要求在Open以前先對online redo log的sequence重置爲1,讓redo的sequence從新開始,而且會重置當前的聯機重作日誌。)而redo的重置會形成當前數據庫就會不認識以前作的備份了(redo序列號爲1至關於開啓了一個新的週期,而以前的序列號就是上個週期的數據了),因此我在使用以前的備份來還原數據庫就會出錯了。
      Resetlogs命令表示一個數據庫邏輯生存期的結束和另外一個數據庫邏輯生存期的開始,Oracle把這個數據庫邏輯生存期稱爲incarnation;每次使用resetlogs打開數據庫,就會使incarnation + 1,也就是產生一個新的incarnation;若是想要恢復到以前incarnation的scn/time,就須要先恢復到以前的incarnation;
報錯解決方法:( 只適用於Oracle10G及以後的版本,在10g以前的版本,數據庫執行完OPEN RESETLOGS操做以後,都建議馬上進行一次徹底備份,由於以前版本中在執行OPEN RESETLOGS操做時並不對當前的Online Redologs文件進行歸檔,這會致使歸檔文件再也不連續,所以以前建立的備份再也不有效(恢復不到當前狀態了,只能恢復到OPEN RESETLOGS操做以前)。10g及以後版本就不存在這個問題了,OPEN RESETLOGS操做會首先將當前在線重作日誌文件歸檔(若是可以訪問到的話),而且OPEN RESETLOGS操做也會記入Online Redologs文件並正常歸檔,這樣保證了歸檔日誌文件的連續性,以前的備份依然有效,可是仍然須要進行incarnation切換,不然仍然識別不了以前incarnation的備份)
(1)在rman中使用list incarnation命令查找系統中的incarnation
(2)在其中找到上次備份時所在的incarnation
(3)使用reset database to incarnation 2; (其中2爲上次的incarnation號)
作完這些操做後,oracle就會認識到以前的備份了,再次進行恢復,就能夠了。
 
而9i及以前的版本恢復就有些困難了,而且要知足一下條件:
(1)存在resetlogs點以前的控制文件備份
(2)當前控制文件的備份
(3)可以獲取resetlogs scn(是數據庫用resetlogs選項打開時對應的scn,這個scn能夠再alter_SID.log文件中尋找(resetlogs after incomplete recovery UNTIL CHANGE scn號))
(4)數據文件的備份是最近resetlogs點前的備份
(5)有備份點到resetlogs scn的歸檔日誌
(6)存在resetlogs scn到恢復點之間的歸檔日誌
恢復分爲兩步驟,分別爲resetlogs以前和以後:
       Resetlogs以前:
(1)得到resetlogs scn
(2)關閉數據庫
(3)將當前空值文件拷貝到另外的位置
(4)啓動rman
(5)啓動數據庫到nomount狀態
(6)運行reset database to incarnation incarnation號
(7)執行run命令塊
Run{
Set until scn resetlogs_scn;
Allocate channel c1 device type disk;
Restore controlfile;
Alter database mount;
Restore datafile;
Recover datbase;
}
(8)關閉數據庫
Resetlogs 以後:
(1)復原以前的控制文件
(2)啓動數據庫到nomount
(3)運行 reset database to incarnation incarnation號,使數據庫的incarnation號爲當前的incarnation
(4)Mount數據庫
(5)恢復數據庫到指望的點
(6)打開數據庫,完成恢復。
 
  http://book.51cto.com/art/200912/170082.htm 這個地址是我從網上找到的資料,裏面將原理寫的很詳細。
相關文章
相關標籤/搜索