Sql-Server
為什麼 SQL Server 從 minLSN 而不是最後一個 CHECKPOINT 開始 REDO 階段?
在閱讀BOL 的一篇文章時,我停留在解釋數據庫恢復過程的圖片上(沒有 ADR):
不應該第 2 階段:重做從 Last CHECKPOINT 開始,直到那時一切都已經在數據文件中了?為什麼從minLSN開始?
數據庫檢查點文件說
出於性能原因,數據庫引擎對記憶體中的數據庫頁面(在緩衝區記憶體中)執行修改,並且不會在每次更改後將這些頁面寫入磁碟。相反,數據庫引擎會定期在每個數據庫上發布一個檢查點。檢查點將目前記憶體中修改的頁面(稱為臟頁)和事務日誌資訊從記憶體寫入磁碟,並將資訊記錄在事務日誌中。
因此
CHECKPOINT
,它與事務沒有直接關係,而是與可能不屬於同一事務的髒頁有關,這解釋了為什麼數據庫的恢復過程必須考慮 MinLSN 而不是CHECKPOINT
您建議的最後一個。如果您查看Transaction Log Physical Architecture的結構,您會發現檢查點可能發生在最舊的活動 VLF 前面的 VLF 中,如下圖所示:
考慮到這一點,認為一個非常長的事務 (T1) 開始使用虛擬日誌 3 並且僅在虛擬日誌 4 結束時完成。在 T1 執行期間發生了另一個事務 (T2),但是這個事務在
CHECKPOINT
. 現在想像一下發生了崩潰。如果恢復過程以 t1 為起點CHECKPOINT
,它可以重做 T2,但不會為恢復的數據庫授予一致的狀態,因為數據庫在 T1 完成之後CHECKPOINT
但之前發生了崩潰,留下了一半的事務已註冊什麼時候應該回滾。您還可以在問題中的圖片上看到該範例,其中Oldest uncommitted Tx在****Last Checkpoint之前開始。