首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle Redo Log Buffer 與 LGWR 機制深度解析:觸發條件、寫入流程與效能調優

     編輯:Oracle 資料庫基礎

核心角色:LGWR(Log Writer)

LGWR 是 Oracle 背景進程中負責將 Redo Log Buffer(重做日誌緩衝區)中的「髒日誌塊」寫入線上重做日誌檔的關鍵進程。其寫入方式為循序寫入,無隨機 I/O,因此速度極快。

LGWR 啟動的六大觸發條件

  1. 前台進程觸發(Commit/Rollback):使用者執行 COMMIT 或 ROLLBACK 時,為確保資料不丟失,強制 LGWR 將記憶體中該事務的重做記錄刷入磁碟。
  2. 前台進程觸發(空間不足):當 Log Buffer 剩餘空間不足以容納新的重做記錄時,前台進程會喚醒 LGWR 釋放空間。
  3. 定時喚醒(每 3 秒):LGWR 內建計時器,每 3 秒檢查一次是否有髒塊需寫入。
  4. DBWR 觸發:DBWR 要寫入髒資料塊前,若發現對應的重做記錄尚未持久化,會觸發 LGWR 並等待其完成(Write-Ahead Logging 協議)。
  5. 佔用超過 1/3:Log Buffer 使用量達到總大小的 1/3 時觸發。
  6. 佔用超過 1 MB:累積重做量達 1 MB 時觸發。
  7. 日誌切換:發生 Log Switch 時強制觸發。

重做記錄的最小單位:Change Vector(改動向量)

每一個 Change Vector 描述對單一資料塊的一次修改,包含:

  • 資料塊版本號 —— 確保恢復時能套用至正確版本
  • 事務操作代碼
  • 資料塊地址(DBA)

恢復時,Oracle 讀取 Change Vector 並套用至對應資料塊,完成後該塊版本號 +1。臨時表空間的臨時段不產生 Change Vector。

UPDATE 事務產生的三類 Change Vector

若修改欄位有索引,會產生額外的重做記錄描述索引塊修改;COMMIT/ROLLBACK 時再產生一筆單一 Change Vector 的重做記錄,更新事務表狀態。

效能調優建議

  • 調大 LOG_BUFFER:減少 LGWR 喚醒頻率,批次寫入效率更高(需配合大型交易系統評估)。
  • 多路徑重做日誌:將 Online Redo Log 多路徑分散至不同磁碟/控制器,降低 I/O 爭用。
  • 避免頻繁 COMMIT:批次業務盡量集中提交,減少 LGWR 強制刷盤次數。
  • 監控 log file sync 等待:若該等待事件佔比高,檢查儲存子系統延遲或 Commit 頻率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
序號修改對象說明
1Rollback Segment 事務表位於 Rollback Segment Header,記錄事務狀態、使用的 Rollback Segment 地址
2Rollback Segment 資料塊儲存修改前的舊值(如 abc),供回滾使用
3目標表資料塊寫入修改後的新值(如 cdf)