核心角色:LGWR(Log Writer)
LGWR 是 Oracle 背景進程中負責將 Redo Log Buffer(重做日誌緩衝區)中的「髒日誌塊」寫入線上重做日誌檔的關鍵進程。其寫入方式為循序寫入,無隨機 I/O,因此速度極快。
LGWR 啟動的六大觸發條件
- 前台進程觸發(Commit/Rollback):使用者執行 COMMIT 或 ROLLBACK 時,為確保資料不丟失,強制 LGWR 將記憶體中該事務的重做記錄刷入磁碟。
- 前台進程觸發(空間不足):當 Log Buffer 剩餘空間不足以容納新的重做記錄時,前台進程會喚醒 LGWR 釋放空間。
- 定時喚醒(每 3 秒):LGWR 內建計時器,每 3 秒檢查一次是否有髒塊需寫入。
- DBWR 觸發:DBWR 要寫入髒資料塊前,若發現對應的重做記錄尚未持久化,會觸發 LGWR 並等待其完成(Write-Ahead Logging 協議)。
- 佔用超過 1/3:Log Buffer 使用量達到總大小的 1/3 時觸發。
- 佔用超過 1 MB:累積重做量達 1 MB 時觸發。
- 日誌切換:發生 Log Switch 時強制觸發。
重做記錄的最小單位:Change Vector(改動向量)
每一個 Change Vector 描述對單一資料塊的一次修改,包含:
- 資料塊版本號 —— 確保恢復時能套用至正確版本
- 事務操作代碼
- 資料塊地址(DBA)
恢復時,Oracle 讀取 Change Vector 並套用至對應資料塊,完成後該塊版本號 +1。臨時表空間的臨時段不產生 Change Vector。
UPDATE 事務產生的三類 Change Vector
| 序號 | 修改對象 | 說明 |
| 1 | Rollback Segment 事務表 | 位於 Rollback Segment Header,記錄事務狀態、使用的 Rollback Segment 地址 |
| 2 | Rollback Segment 資料塊 | 儲存修改前的舊值(如 abc),供回滾使用 |
| 3 | 目標表資料塊 | 寫入修改後的新值(如 cdf) |
若修改欄位有索引,會產生額外的重做記錄描述索引塊修改;COMMIT/ROLLBACK 時再產生一筆單一 Change Vector 的重做記錄,更新事務表狀態。
效能調優建議
- 調大 LOG_BUFFER:減少 LGWR 喚醒頻率,批次寫入效率更高(需配合大型交易系統評估)。
- 多路徑重做日誌:將 Online Redo Log 多路徑分散至不同磁碟/控制器,降低 I/O 爭用。
- 避免頻繁 COMMIT:批次業務盡量集中提交,減少 LGWR 強制刷盤次數。
- 監控 log file sync 等待:若該等待事件佔比高,檢查儲存子系統延遲或 Commit 頻率。
- 上一篇文章: Oracle 連接查詢完全指南:內連接、外連接與全連接詳解
- 下一篇文章: Oracle 使用者帳號解鎖與鎖定完整操作指南
Copyright ©
程式碼之家 All Rights Reserved