用 ChatGPT 查了下 redo log 是怎麼用在 database crash or power loss 後的 recovery 裡,這邊做個小筆記統整一下:
- 進行交易時,會依序進行以下步驟:
- 假如在 commit 前斷電,database server 重啟後,會執行以下 recovery process:
- 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 是有順序性的)
- Undo: 把 reapply 的那些 redo logs 裡,transaction state 為 uncommitted 的進行 rollback operation
- Note: 為何不是單純 ignore 那些 uncommitted 的 redo logs 就好?
- 因為那些 redo logs 可能已經有 partially write to database files 了,所以為了確保 consistency, 必須要先 redo 再 undo
- Redo: 從 checkpoint 以後的 redo log 開始去 reapply 剩下的 redo logs 的 changes