差异备份 (SQL Server)

适用于:SQL Server

此备份和还原主题与所有 SQL Server 数据库相关。

差异备份基于最新的、以前的完整数据备份。 差异备份仅捕获自上次完整备份以来更改过的数据。 差异备份所基于的完整备份称为差异备份的基础。 完整备份(仅复制备份除外)可以用作一系列差异备份(包括数据库备份、部分备份和文件备份)的基础。 完整备份、文件备份或部分备份中可以包含文件差异备份的基础备份。

优点

创建差异备份比创建完整备份要快得多。 差异备份仅记录自差异备份所基于的完整备份以来已更改的数据。 这有助于频繁地进行数据备份,从而降低数据丢失风险。 但是,在还原差异备份之前,必须先还原其基础备份。 因此,从差异备份进行还原时,所需步骤和时间必然要比从完整备份还原多,因为需要两个备份文件。

如果数据库的某个子集比该数据库的其余部分修改得更为频繁,则差异数据库备份尤其有用。 在这些情况下,使用差异数据库备份时,可以频繁执行备份,并且不会产生完整数据库备份的开销。

在完整恢复模型下,使用差异备份可以减少必须还原的日志备份数量。

差异备份概述

差异备份捕获在创建差异基准和创建差异备份之间发生更改的任何盘区(物理上连续的八个页的集合)的状态。 这意味着,给定差异备份的大小取决于自基础备份以来更改过的数据量。 通常,基础备份越旧,新差异备份就越大。 在一系列差异备份中,频繁更新的盘区可能会在每个差异备份中包含不同的数据。

下图显示差异备份的工作方式。 该图显示了 24 个数据盘区,其中 6 个更改过。 差异备份只包含这六个数据盘区。 差异备份操作取决于位图页面,其中每个盘区包含一位。 对于自基础备份以来更新过的每个盘区,该位在位图中设置为 1。

微分位图如何标识已更改的盘区的示意图。

注意

仅复制备份不会更新差异位图。 因此,仅用于复制的备份不会影响后续的差异备份。

在建立基准之后立即执行的差异备份可能会明显小于差异基准。 这可节省存储空间和备份时间。 但是,当数据库随着时间的推移发生更改时,数据库与特定差异基础之间的差异将增加。 差异备份与其基础备份的间隔时间越长,差异备份可能就越大。 这意味着,差异备份的大小最终会接近差异基础的大小。 较大的差异备份将丧失更快更小备份的优势。

当差异备份的大小增大时,还原差异备份会显著增加还原数据库所需的时间。 因此,建议按设置的间隔进行新完整备份,以便建立数据的新差异基础。 例如,可以每周执行一次整个数据库的完整备份(即完整数据库备份),然后在该周内执行一系列常规的差异数据库备份。

在还原时,在还原差异备份之前,必须先还原其基础备份。 然后只需还原最新的差异备份,即可将数据库前滚到创建差异备份的时间。 通常,应该先还原最新的完整备份,然后再还原基于该完整备份的最新差异备份。

具有内存优化表的数据库的差异备份

有关差异备份的具有内存优化表的数据库的详细信息,请参阅备份具有内存优化表的数据库

只读数据库的差异备份

对于只读数据库,单独使用完整备份比同时使用完整备份和差异备份更易于管理。 当数据库为只读时,备份和其他操作无法更改文件中包含的元数据。 因此,差异备份所要求的元数据(如差异备份开始的日志序列号,即差异基准 LSN)存储在 master 数据库中。 如果在数据库只读时采用差异基准,则差异位图指示的更改会比基准备份之后实际发生的更改更多。 额外的数据由备份读取,但不会写入到备份中,因为存储在 backupset 系统表中的 differential_base_lsn 用于确定是否在基准备份之后更改了数据。

重新生成、还原只读数据库或者分离再附加只读数据库后,差异基础信息将丢失。 这是由于 master 数据库与用户数据库不同步造成的。 SQL Server 数据库引擎无法检测或阻止此问题。 所有后续差异备份都不是基于最新的完整备份,因此可能会出现出人意料的结果。 若要建立新差异基础,建议先创建完整数据库备份。

对只读数据库进行差异备份的最佳做法

创建只读数据库的完整数据库备份之后,如果要创建后续差异备份,请备份 master 数据库。

如果 master 数据库丢失,请先将其还原,然后再还原用户数据库的任何差异备份。

如果分离和附加计划稍后对其使用差异备份的只读数据库,则应尽快执行此只读数据库和 master 数据库的完整数据库备份。