CheckPoint 是資料庫引擎核心背景程序,但廣為流傳的認知多有偏差。本文針對四大誤區,以實驗與原理解析正本清源。
事實:CheckPoint 以資料庫為粒度執行。每個資料庫維護獨立的 CheckPoint LSN、髒頁清單。實例級設定 (recovery interval) 僅控制目標恢復時間,實際執行時逐個資料庫推進。
實驗:兩連線分別操作不同資料庫產生髒頁,對資料庫 A 執行 CHECKPOINT,僅 A 的髒頁寫入磁碟,B 的髒頁仍駐留 Buffer Pool。
事實:自動 CheckPoint (依 recovery interval 觸發) 僅針對有髒頁且估計恢復時間超過目標的資料庫執行。閒置資料庫不會被掃描。
事實:無論交易是否 Commit,髒頁皆會被 CheckPoint 寫入磁碟 (WAL 保證 Redo/Undo 能力)。未 Commit 的修改寫入資料檔後,若交易回滾,恢復階段會透過記錄檔 Undo 還原。
驗證:見部落格文章「再談 SQL Server 中記錄檔的作用」中 CheckPoint 實驗。
事實:串行執行。啟用追蹤旗標 3502 可見同一 SPID 依序輸出各資料庫 CheckPoint 訊息。
| 類型 | 觸發條件 | 範圍 | 備註 |
|---|---|---|---|
| Automatic | 恢復間隔超標 | 單一資料庫 | 背景執行緒 |
| Indirect | 目標恢復時間 (Target Recovery Time) 配置 | 單一資料庫 | SQL 2012+,更精確控制 |
| Manual | CHECKPOINT 命令 | 當前資料庫 | 同步/非同步可選 |
| Internal | 備份、資料庫檔案操作、AlwaysOn 截斷等 | 單一資料庫 | 內部必要動作 |