Oracle例項恢復的時候所採用的 two-phase recovery/two pass recovery

wei-xh發表於2012-07-04

Oracle Core第六章的時候,Lewis提到了Oracle做例項恢復時候的two-phase recovery,其實就是需要讀取兩遍日誌:

Lewis描述的two-phase recovery過程:

第一次讀日誌,讀取的起點是從控制檔案裡獲得,因為增量檢查點每3秒會更新控制檔案頭,記錄寫的進度和最後寫出塊的lrba。在讀取日誌的過程中,過濾出bwrblock write record)記錄,這個bwroracle沿檢查點佇列寫的時候,每批次的寫幾個塊,就要寫一個bwr日誌記錄到log file裡,Oracle過濾出bwr日誌,並且根據bwr記錄在資料庫裡維護一個列表,因為bwr日誌裡,記錄塊最後被修改的scn

第二次讀日誌,把日誌內容涉及到的資料塊讀取到磁碟,應用Redo。這個過程裡,需要檢查redo裡記錄的資料塊是不是bwr列表裡的資料塊,如果是,繼續比對scn是不是比bwr列表裡記錄的資料塊的scn小或者相等,如果小或者相等,那麼這個資料塊就可以不物理讀取了,不需要恢復,因為已經寫入到磁碟了。

但是DSI裡對two-phase recovery的描述不是這樣的:

第一次讀取日誌,把日誌檔案裡涉及到的資料塊讀取到記憶體裡構建成一個BLOCK列表,並且把有bwr寫記錄的塊從列表裡移除。

第二次讀取日誌,應用日誌,如果讀取到的日誌,涉及的塊不在列表裡說明已經寫出(bwr),不用應用日誌了。

 

Lewis提到的和DIS裡寫的不一樣,是Oracle 9i後,機制發生了變化?還是誰的描述有誤?我倒不糾結Oracle到底用的是哪種,兩個方法都能實現恢復,第一種辦法更巧妙點。

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

相關文章