Redo Logs in Database Systems

用 ChatGPT 查了下 redo log 是怎麼用在 database crash or power loss 後的 recovery 裡,這邊做個小筆記統整一下:

  • 進行交易時,會依序進行以下步驟:
    1. 寫 redo log, 裡面記錄準備要做的改變,並記錄這個 transaction 的狀態為 in progress
    2. 把 redo log 紀錄的那些改變實際寫入 database files
    3. 把 redo log 的 transaction 狀態改為 committed
    4. 回傳 OK
  • 假如在 commit 前斷電,database server 重啟後,會執行以下 recovery process:
    1. Redo: 從 checkpoint 以後的 redo log 開始去 reapply 剩下的 redo logs 的 changes
      • 因為那些 uncommitted 的 redo logs 的 changes 很有可能已經有部分寫入到 database files(pages) 裡,所以會先檢查 pages 裡的 LSN (Log Sequence Number), 假如 page 裡的 LSN >= redo log 的,代表該 redo log 的 change 已經寫入了,就不用再 apply (LSN 是有順序性的)
    2. Undo: 把 reapply 的那些 redo logs 裡,transaction state 為 uncommitted 的進行 rollback operation
    • Note: 為何不是單純 ignore 那些 uncommitted 的 redo logs 就好?
      • 因為那些 redo logs 可能已經有 partially write to database files 了,所以為了確保 consistency, 必須要先 redo 再 undo

評論

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×