我一直在阅读Paul Randal 撰写的关于 SQL Server 备份过程的博客文章,其中概述了完整备份的主要阶段。他提到的一点是,在完整备份期间,进程会读取“所有分配的盘区,无论该盘区中的所有 8 个页面是否都在使用中”。
完整备份有以下主要阶段:
- 执行检查点。
- 从数据文件中读取所有正在使用的数据(从技术上讲,读取所有分配的盘区,无论盘区中的所有 8 个页面是否都在使用)。
- 读取从初始检查点最旧的未提交事务开始到第 2 阶段完成的时间的所有事务日志。这是必要的,以便数据库可以在恢复过程中恢复到一致的时间点(有关更多详细信息,请参阅这篇文章)。
- (可选地测试所有页面校验和,可选地执行备份压缩,并且可选地执行备份加密)。
这个说法让我想知道到底备份了什么内容。具体来说,备份过程是否包括所有分配的扩展区,即使这些扩展区中的所有页面并未都在使用中?
如果您对此主题有任何见解或澄清,我将不胜感激。预先感谢您的帮助!
是的。一般而言,范围是数据库对象的对象分配的最低单位(从技术上讲,自 2016 年以来,所有新数据库都使用统一的范围,尽管使用共享范围时会分配单个页面)。无论如何,数据文件中的分配单位和备份单位都是范围。
如果您愿意的话,您可以亲自对此进行测试来检查其行为。
我创建了一个测试数据库,其中没有任何内容,创建了一个表,并放入了一个小宽度行。这将为我提供部分填充的统一范围(实际上是一个页面,因此 1 个页面正在使用,7 个页面当前未使用,因此被保留)。
请注意,为表分配的第一个页(不是 IAM 页)位于 392,它始终是范围的开始。计算一下,第 392 页位于盘区 49(盘区中的 392 页/8 页),在磁盘上的偏移量(392 页 * 每页 8192 字节)为 3211264。
如果我们进行备份,正如您在原始帖子中所述,首先会发生一个检查点,以便所有脏页和任何需要的日志块都刷新到磁盘,因为磁盘上的文件是为了备份而读取的文件数据库。这意味着我们应该对该范围进行读取,并且读取的大小应该是该范围的大小(64k)。
从上图可以看出,确实是这样的。无论仅“分配”单个页面,都会备份整个范围。为了进一步证明这一点,可以对恢复执行除写入之外的相同过程。
从上面可以看到,恢复从我们计算的磁盘上的盘区偏移量写入了整个盘区(64k)。因此,对数据库中的典型对象执行此操作的级别是范围级别,即 64k。
请注意,并非所有IO 都是 64k,并且不同的控制结构可能需要不同的行为。这不是OP的问题,而是为学究们提出的。
另请注意,保罗在他的原始帖子中回答了这个问题: