我们已经讨论了各种不同的页,包括数据页、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页的信息。

 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。这个备份将用来后续差异备份的基础。有个选项可以设置完全备份不影响现存的备份链。

 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页重设位状态,标记它们为未改变。

参考文章:

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

SQL Server存储(6/8) :理解DCM页的更多相关文章

  1. SQL Server :理解DCM页

    原文:SQL Server :理解DCM页 我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map ...

  2. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  3. SQL Server 存储(3/8):理解GAM和SGAM页

    我们知道SQL Server在8K 的页里存储数据.分区就是物理上连续的8个页.当我们创建一个数据库,数据文件会被逻辑分为页和区,当用户对象创建时,页会分配给它用来存储数据.GAM(Global Al ...

  4. SQL Server 存储(8/8):理解数据文件结构

    这段时间谈了很多页,现在我们可以看下这些页在数据文件里是如何组织的. 我们都已经知道,SQL Server把数据文件分成8k的页,页是IO的最小操作单位.SQL Server把数据文件里的第1页标记为 ...

  5. SQL SERVER存储引擎——04.数据

    4. SQL SERVER存储引擎之数据篇 (4.1)文件 (0)主数据文件.mdf初始文件大小至少为3MB,次要数据文件.ndf初始大小,同日志文件一样至少为512KB: (1)SQL SERVER ...

  6. SQL Server存储ntext截断问题

    SQL Server存储ntext截断问题   最近遇到一个问题:将大文本存储到数据库的时候,查询出来的文本却被截断了. 最后百度发现,作者提出 sql server management studi ...

  7. SQL Server 存储(5/8):理解IAM 页

    在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...

  8. SQL Server存储(7/8) :理解BCM页

    今天我们来讨论下批量更改映射(Bulk Changed Map:BCM)页,还有大容量日志恢复模式( bulk logged recovery model )如何运作的. 批量更改映射(Bulk Ch ...

  9. SQL Server 存储(2/8):理解数据记录结构

    在SQL Server :理解数据页结构我们提到每条记录都有7 bytes的系统行开销,那这个7 bytes行开销到底是一个什么样的结构,我们一起来看下. 数据记录存储我们具体的数据,换句话说,它存在 ...

随机推荐

  1. Smack 3.3.1 发布,Java 的 XMPP 开发包

    Smack 3.3.1 发布了,这是一个小更新版本,主要更新包括: [SMACK-441] - Memory leak in KeepAliveManager [SMACK-447] - Compre ...

  2. jQuery Ready 与 Window onload 的区别(转)

    “我们都知道,很多时候,在页面加载完后都需要做一些相应的初始化动作.例如,运行某些js特效,设置表单等等.怎么知道页面加载完了呢?一 般情况下都是设置body标签的onload监听window的loa ...

  3. 在Linux上以服务的方式运行ASP.NET Core站点

    更新:用supervisor是更好的解决方法,详见 Linux下为 dotnet 创建守护进程 要在生成环境下在Linux服务器上跑ASP.NET Core站点,首先要解决的问题是以服务的方式运行AS ...

  4. 【C语言学习】《C Primer Plus》第1章 概览

    学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyw ...

  5. 实战-Fluxion与wifi热点伪造、钓鱼、中间人攻击、wifi破解

    原作者:PG     整理:玄魂工作室-荣杰 目录: 0x00-Fluxion是什么 0x01-Fluxion工作原理 0x02-Kali上安装fluxion 0x03-Fluxion工具使用说明+实 ...

  6. Unity3D手游开发实践

    <腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/ ...

  7. 赴美工作常识(Part 6 - 绿卡排队)

    上一篇<赴美工作常识(Part 5 - 绿卡优先级)>解释完排队的优先级是怎么确定的,以及 PERM 和 I–140 表的意义,接下来就要解释一下队具体是怎么排的以及排到之后的 I–485 ...

  8. 在ThoughtWorks工作这几年我学到了什么?

    不知不觉,从2012年5月1日加入ThoughtWorks到现在,已经3年有余了.时间过得很快,这三年多我干了很多事情,但仔细想想也没有什么特别值得一提的.在一个公司呆久了总觉得很多事情是理所当然的, ...

  9. 你不可不知的HTML优化技巧

    如何提升Web页面的性能,很多开发人员从多个方面来下手如JavaScript.图像优化.服务器配置,文件压缩或是调整CSS. 很显然HTML 已经达到了一个瓶颈,尽管它是开发Web 界面必备的核心语言 ...

  10. ehcache2拾遗之cache持久化

    问题描述 应用在使用过程中会需要重启等,但是如果ehcache随着应用一起重启,那么刚重启的时候就会出现大量的miss,需要一定的访问量来重建缓存,如果缓存能够持久化,重启之后可以复用将会有助于缓解重 ...