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/

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