rman恢復spfile和control和resetlogs建立控制檔案和不完全恢復疑點

dotaddjj發表於2011-08-26

這些天太忙了,做的事情好瑣碎,不過磨練毅力啊。

由於在windows下啟動資料庫要先啟動資料庫服務的歷程,然後啟動資料庫

cmd>net start oracleserivetest

啟動資料庫服務test歷程

Cmd>sqlplus sys/oracle as sysdba

Startup

一直以為linux也和windows下啟動資料庫一樣,需要啟動服務和資料庫,今天看eygle在循序漸進書中說到linux下不存在資料庫服務這一說話,直接用spfile啟動資料庫就可以了。也難怪以前在手工建立資料庫中提到了oradim,而且此工具只在windows下能使用,是一個註冊服務的工具,在linux等平臺下無法使用。

Oradim –new –sid test

例項已經建立

其實windows下的提示幫助有點迷惑性,以為資料庫例項已經建立了,其實此時只是oracle資料庫在os上所對應的服務已經建立,例項的建立和啟動只是nomount狀態,由sga和後臺程式組成,所以好書值得精讀細讀,有時候前輩們提到的一兩點都值得好好推敲。

資料庫在nomount狀態時,此時丟失控制檔案。在rman中如果開啟控制檔案的自動備份功能,可以直接restore控制檔案。

Rman>restore controlfile to ‘d:control01.ctl’ from autobackup

同樣的可以從控制檔案的自動備份集中提取spfile的資訊

Rman>restore spfile to ‘d:spfiletest.ora’ from autobackup

如果此時缺少控制檔案自動備份集,可以嘗試手工建立控制檔案的指令碼

Create controlfile reuse databae “TEST” resetlogs archivelog

Maxlogfiles 10

Maxlogmembers 3

Maxdatafiles 100

Maxinstances 1

Logfile

‘d:oracleproduct10.2.0oradatatestredo01.log’,

‘d:oracleproduct10.2.0oradatatestredo02.log’,

‘d:oracleproduct10.2.0oradatatestredo03.log’

Datafile

‘d:oracleproduct10.2.0oradatatestsystem01.dbf’,

‘d:oracleproduct10.2.0oradatatestsysaux01.dbf’,

‘d:oracleproduct10.2.0oradatatestuntobs01.dbf’

character set ZHS16GBK

;

基本就是上面的指令碼規範,其實和建立資料庫的指令碼有相同的地方,不過確實也記不住。

如果資料庫控制檔案丟失,而且也沒有備份集,此時可以嘗試試著建立控制檔案然後利用歸檔日誌和線上重做日誌恢復資料庫。

Startup nomount

執行建立控制檔案的指令碼

如果是用resetlogs建立資料庫,oracle會認為當前日誌檔案全部損壞,此次資料庫恢復將是一次不完整恢復,介質恢復資料庫時必須指定using controlfile backup,一旦resetlogs開啟資料庫,oracle就會認為當前日誌檔案已經刪除。

Recover database using controlfile backup unitl cancel

透過控制檔案執行介質恢復

此時我們是recover database using controlfile backup

Recover database恢復資料庫時:資料檔案的scn會以current controlfile為準,利用線上日誌的redo entryarchive log來恢復資料檔案的block資訊到當前控制檔案的scn

Recover database using controlfile backup主要是為了把資料檔案block恢復到當前控制檔案所記錄的scn更靠後的位置,例如用backup controlfile或者createcontrolfile恢復資料檔案時可以把資料檔案的scn比當前控制檔案的scn的更後面一點,此時資料檔案就不會受控制檔案scn的限制,就侷限於你後面的until cancel或者until scn等和archive log redo log

以下情況需使用using controlfile backup

1 使用resetlogs重建控制檔案後,noresetlogs不需要此時oracle認為當前日誌都已經損壞,恢復資料檔案要讓其到當前控制檔案scn靠後一點

2 使用備份的控制檔案恢復資料庫

Alter database open restlogs

resetlogs重建ctl,開啟資料庫也要resetlogs,此時重做日誌開始重新計數。

如果資料庫無法nomount了,那麼可以去altersid.log下查詢資料庫啟動的具體引數,警告日誌會記錄具體的引數,然後手工建立一個pfile來啟動資料庫到nomount

以前nomount狀態細節解析提到了spfile需要的最少引數就是db_name。只要指定db_name就可以利用spfile啟動資料庫。

pfile內容 inittest.ora最少引數:

db_name=test

ramn>startup pfile=’d:oracleproduct10.2.0databaseinittest.ora’ nomount

如果有控制檔案自動備份集可以restore然後重新啟動資料庫

rman>restore spfile to ‘d:oracleproduct10.2..0databasespfiletest.ora’ from autobackup

rman>shutdown immediate

rman>startup;

也可以嘗試rman啟動預設例項

cmd>Rman target /

rman>startup nomount;

rman>restore spfile to ‘’ from autobackup;

不過這裡還是有點疑惑,首先不完全恢復是丟失當前日誌檔案,resetlogs開啟資料庫是因為:resetlogs重建控制檔案,利用備份的控制檔案,不完全恢復三種情況,既然resetlogs方式建立控制檔案oracle會認為當前控制日誌失效,那也就意味著丟失當前日誌檔案,恢復將是一次不完整恢復,但是此時當前日誌檔案確實存在且後面用於同步資料檔案,控制檔案等,此時就只是指定了一次resetlogs建立控制檔案,不應該是不完全恢復。

是否應該是resetlogs建立的控制檔案,轉儲新建的ctl發現ctl中記載的redo log全部都認為未使用,recover database using controlfile backup until cancel,此時控制檔案會按照archive log和當前redo log來同步,如果此時redo log缺少才是一次不完整的恢復,如果選擇auto,oracle會同步到最後一個archive log,redo log,也可以制定scn或者time來滿足此時控制檔案和資料檔案的scn同步,然後open resetlogs後oracle才會真正丟棄當前的redo log然後redo log開始重新計數,此時恢復由於有當前的redo log,是一次完整的資料庫恢復。

eygle提到的了,由於外界伺服器等因素導致資料庫意外關閉,而且又丟失當前redo log的恢復只能是一次不完整的恢復,意外關閉此時buffer cache並沒有寫進磁碟,記載事物的當前redo log丟失,只能是不完全恢復,不完全恢復要以resetlog開啟資料庫,但是resetlogs開啟資料庫並不是不完全恢復,很有可能只是resetlogs建立ctl或者利用備份的ctl,resetlogs建立ctl,open resetlogs時redo log重新計數,利用備份ctl,此時oracle在恢復階段也是利用log來恢復,最後同樣redo log開始重新計數。

[@more@]

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

相關文章