SQL Server存儲(6/8) : 差異變更頁(Differential Change Map:DCM )

SQL Server使用差異變更頁DCM 來跟蹤自上次全備後修改過的區,DCM頁在數據文件裏是第6頁。

DCM爲每個跟蹤的區使用一位來記錄。如果設置爲1,表示自上一次全備後,這個區被修改過。一個DCM頁可以保存64000個左右區的信息,每隔511232頁會增加一個DCM頁。一個DCM頁可以跟蹤63904個區的變更信息。第2個DCM頁會出現在第511238頁。

差異備份通過讀取DCM頁來識別自上一次全備後哪些區被修改過,這會大大減少掃描頁數。

我們新建一個空數據庫,然後進行全備,並通過DBCC PAGE查看DCM頁的信息。

CREATE DATABASE DCMdb
GO
BACKUP DATABASE DCMdb TO DISK='D:\DCMdb.bak'
GO
DBCC TRACEON(3604)
DBCC PAGE('DCMdb',1,6,3)

可以看到,從第0頁到第32頁的區,自上次全備後有發生改變。這並不是說這32頁每頁都有改變。我們可以確定的說,至少有4頁發生改變,每個區一個頁。這可能是因爲完全備份命令觸發的內部表改變。

往表裏插入點數據,再用DBCC PAGE命令看下DCM頁的信息。

SELECT * INTO DCMdb..SalesOrderDetail FROM AdventureWorks2008R2.sales.SalesOrderDetail
DBCC PAGE('DCMdb',1,6,3)

通過SELECT INTO往表裏插入數據,這會觸發很多系統表的變更,結果我們看到自上次全備後,很多區被標記爲改變。一直到1:167頁,都是內部對象的修改。從1:184至1:1679,是因爲SELECT INTO語句觸發的。當我們進行差異備份時,SQL Server讀取DCM頁,這些變更頁會在差異備份裏做上標記。例如我們剛纔提到的,頁(1:0-1:24)在DCM頁標記爲改變頁,實際可能只有有4個頁發生改變,但在差異備份裏,這32個頁都會備份。

我們進行一個差異備份,並通過DBCC PAGE看看DCM頁的信息。

BACKUP DATABASE DCMdb TO DISK='D:\DCMdbifferential.bak' WITH DIFFERENTIAL
DBCC PAGE('DCMdb',1,6,3)

可以看到差異備份不會改變DCM頁的內容。

來計算下這個備份大小是否和DCM改變頁的大小一致。((32-0)+(56-48)+(88-72)+(136-112)+(168-144)+(1680-184))*8=12800KB ,基本接近,這裏的差距是文件頭信息。

我們現在進行一次完整備份,再用DBCC PAGE看下DCM頁的信息。

BACKUP DATABASE DCMdb TO DISK='D:\DCMdb2.bak'
DBCC PAGE('DCMdb',1,6,3)

現在SQL Server清空了DCM頁。所有頁都被標記爲未改變,除了4個分區1:0-1:32。這個備份將作後續差異備份的基礎。有個選項COPY_ONLY可以設置完全備份不影響現存的備份鏈。

BACKUP DATABASE DCMdb TO DISK='D:\DCMdb2_Copy.bak' WITH COPY_ONLY

在這個情況下,SQL Server不會重設DCM頁。DCMdb2.bak文件還是全備文件,但並未後續差異備份做基礎。

小結一下:SQL Server通過DCM頁跟蹤分區改變信息。當進行差異備份時,SQL Server只備份DCM頁裏標記爲改變的區。差異備份不會清空DCM頁,它只備份從上次全備後發生改變的區。當進行全備時,重設DCM頁位狀態,標記爲未改變。

 

參考

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/07/23/sql-server-understanding-differential-changes-map-dcm-and-differential-backups/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章