我們已經討論了各種不同的頁,包括數據頁、GAM與SGAM頁、PFS頁,還有IAM頁。今天我們來看下差異變更頁(Differential Change Map:DCM),還有差異備份(differential backups)。
差異變更頁(Differential Change Map:DCM ) :SQL Server使用差異變更頁來跟蹤自上次完全備份后修改過的區。DCM頁在數據文件里是第6頁。DCM頁用來跟蹤完全備份后修改過的區。DCM為每個跟蹤的區使用每一位來記錄。如果這個位是設置為1,那么自上一次完全備份后,這個區是被修改過了。如果這個位設置為0,那么自上一次完全備份后,這個區沒有修改過。一個DCM頁可以保存64000個左右區的信息。每隔511232頁,DCM會重復一個。一個DCM頁可以跟蹤63904個區的變更信息。第2個DCM頁會出現在第511238頁。
差異備份通過讀取DCM頁來識別自上一次完全備份后,哪些區被修改過。這會大大減少差異備份掃描頁數。差異備份花費的時間與自上次完全備份后修改的區數成正比,與整個數據庫的大小無關。
我們新建一個空數據庫,然后將其完全備份,并通過DBCC PAGE查看DCM頁的信息。
1 CREATE DATABASE DCMdb2 GO3 BACKUP DATABASE DCMdb TO DISK='D:/DCMdb.bak'4 GO5 DBCC TRACEON(3604)6 DBCC PAGE('DCMdb',1,6,3)
可以看到,從第0頁到第32頁的區,自上次完全備份后,有發生改變。這并不是說,這32頁每頁都有改變。我們可以確定的說,至少有4頁發生改變,一個區一個頁。這可能是因為完全備份命令觸發的內部表改變。
我們往表里插入點數據,再用DBCC PAGE命令看下DCM頁的信息。
1 SELECT * INTO DCMdb..SalesOrderDetail FROM AdventureWorks2008R2.sales.SalesOrderDetail2 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頁的信息。
1 BACKUP DATABASE DCMdb TO DISK='D:/DCMdbifferential.bak' WITH DIFFERENTIAL2 3 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頁的信息。
1 BACKUP DATABASE DCMdb TO DISK='D:/DCMdb2.bak'2 DBCC PAGE('DCMdb',1,6,3)
現在SQL Server清空了DCM頁。所有頁都被標記為未改變,除了4個分區1:0-1:32。這個備份將用來后續差異備份的基礎。有個選項可以設置完全備份不影響現存的備份鏈。
1 BACKUP DATABASE DCMdb TO DISK='D:/DCMdb2_Copy.bak' WITH COPY_ONLY
在這個情況下,SQL Server不會重設DCM頁。DCMdb2.bak文件還是完全備份文件,并未后續差異備份做基礎。這在一些你想完全備份又不想影響到備份鏈的時候可以用到。小結一下:SQL Server通過DCM頁跟蹤分區改變信心。當進行差異備份時,SQL Server只備份DCM頁里標記為改變的區。它幫助SQL Sever加速差異備份操作,通過不掃描所有的頁看看有沒有修改(或自上次完整備份有沒有改變)。差異備份不會清空DCM頁,它只備份從上次完全備份后發生改變的區。當進行完整備份時,SQL Server在DCM頁重設位狀態,標記它們為未改變。
新聞熱點
疑難解答