1. 程式人生 > >Oracle 重做(Redo)日誌介紹

Oracle 重做(Redo)日誌介紹

1. Redo的作用

在資料庫中,Redo的功能主要通過 3 個元件來實現:Redo Log Buffer、LGWR 後臺程序 和Redo Log File(在歸檔模式下,Redo Log File 最終會寫出為歸檔日誌檔案)。 在Oracle的SGA 中,存在一塊共享記憶體,稱為 Redo Log Buffer.

Redo Log Buffer 位於SGA 之中,是一塊迴圈使用的記憶體區域,其中儲存資料庫變更的 相關資訊。這些資訊以重做條目(Redo Entries )形式儲存(Redo Entries 也經常被稱為 Redo Records)。Redo Entries 包含重構、重做資料庫變更的重要資訊,這些變更包括 INSERT、 UPDATE、DELETE 、CREATE 、ALTER 或者DROP等。在必要的時候 Redo Entries 被用於資料庫 恢復。

Redo Entries 的內容被 Oracle 資料庫程序從使用者的記憶體空間複製到SGA 中的Redo Log Buffer 之中。Redo Entries 在記憶體中佔用連續的順序空間,由於Redo Log Buffer 是迴圈使 用的,Oracle 通過一個後臺程序 LGWR 不斷地把 Redo Log Buffer 的內容寫出到 Redo Log File 中。

當用戶在Buffer Cache 中修改資料時,Oracle 並不會立即將修改資料寫出到資料檔案 上,因為那樣做效率會很低,到目前為止,計算機系統中最繁忙的部分是磁碟的 I/O 操作, Oracle這樣做的目的是為了減少 IO 的次數,當修改過的資料達到一定數量之後,可以進行 高效地批量寫出。

大部分傳統資料庫(當然包括 Oracle )在處理資料修改時都遵循 no-force-at-commit 策略。也就是說,在提交時並不強制寫。那麼為了保證資料在資料庫發生故障時(例如斷電) 可以恢復,Oracle 引入了 Redo 機制,通過連續的、順序的日誌條目的寫出將隨機的、分散 的資料塊的寫出推延。這個推延使得資料的寫出可以獲得批量效應的效能提升。

同Redo Log Buffer 類似,Redo Log File 也是迴圈使用的,Oracle 允許使用最少兩個 日誌組。預設情況下,資料庫建立時會建立 3 個日誌組。

SQL> select group#,members,status from v$log; 
    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          1 INACTIVE
         2          1 INACTIVE
         3          1 CURRENT
         4          1 INACTIVE

當一個日誌檔案寫滿之後,會切換到另外一個日誌檔案,這個切換過程稱為Log Switch 。 Log Switch 會觸發一個檢查點,促使 DBWR 程序將寫滿的日誌檔案保護的變更資料寫回到數 據庫。在檢查點完成之前,日誌檔案是不能夠被重用的。

由於Redo機制對於資料的保護,當資料庫發生故障時,Oracle就可以通過 Redo重演進 行資料恢復。那麼一個非常重要的問題是,恢復應該從何處開始呢?

如果讀取的Redo 過多,那麼必然導致恢復的時間過長,在生產環境中,我們必需保證恢 復時間要儘量得短。Oracle 通過檢查點(Checkpoint )來縮減恢復時間。檢查點只是一個數據庫事件,它存在的根本意義在於減少恢復時間。 當檢查點發生時(此時的 SCN 被稱為Checkpoint SCN )Oracle會通知 DBWR程序,把修 改過的資料,也就是此 Checkpoint SCN 之前的髒資料(Dirty Buffer )從 Buffer Cache 寫 入磁碟,在檢查點完成後 CKPT程序會相應地更新控制檔案和資料檔案頭,記錄檢查點資訊, 標識變更。

在檢查點完成之後,此檢查點之前修改過的資料都已經寫回磁碟,重做日誌檔案中的相 應重做記錄對於崩潰/例項恢復不再有用。如果此後資料庫崩潰,那麼恢復只需要從最後一次 完成的檢查點開始恢復即可。如果資料庫執行在歸檔模式(所有生產資料庫,都建議執行在 歸檔模式),日誌檔案在重用之前必須寫出到歸檔日誌檔案,歸檔日誌在介質恢復時可以用來 恢復資料庫故障。