首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

Checkpoint 會將未提交交易的髒頁寫入磁碟:打破「只寫入已提交」迷思

     編輯:關於SqlServer

迷思

Checkpoint 只會將已提交交易的資料頁寫入磁碟。

事實

Checkpoint 會將自上次 Checkpoint 以來所有在記憶體中被修改的頁面(髒頁)寫回磁碟,不論所屬交易是否已提交。唯一例外是 tempdb,其 Checkpoint 不包含寫回髒頁步驟。

為何要寫入未提交的髒頁?

這是預寫記錄(WAL)協定的核心:為了縮短復原時間。資料庫啟動/還原時,從最後一個 Checkpoint 開始重做,若未提交的髒頁已在磁碟,Redo 階段可直接跳過,再由 Undo 階段回滾。若未寫入,Redo 需從記錄重新套用,耗時更長。

驗證腳本(需追蹤旗標 3502, 3504, -1)

CREATE DATABASE CheckpointTest; GO
USE CheckpointTest; GO
CREATE TABLE t1 (c1 INT IDENTITY, c2 CHAR(8000) DEFAULT 'a');
CREATE CLUSTERED INDEX t1c1 ON t1(c1); GO
SET NOCOUNT ON; GO
CHECKPOINT; GO
DBCC TRACEON (3502, 3504, -1); GO
BEGIN TRAN; GO
INSERT INTO t1 DEFAULT VALUES; GO 1280  -- 產生 ~10MB 髒頁
CHECKPOINT; GO
-- 錯誤日誌會顯示:未提交交易的髒頁被寫入磁碟

相關資源

  • TechNet 雜誌:〈Understanding Logging and Recovery in SQL Server〉
  • 部落格:〈How do checkpoints work and what gets logged〉、〈What does checkpoint do for tempdb?〉

Checkpoint 寫入未提交髒頁錯誤日誌示意

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved