了解 SQL Server 中备份的还原和恢复工作方式

本主题与所有 SQL Server 数据库相关。

“还原”是指从备份复制数据并将记录的事务应用于该数据以使其前滚到目标恢复点的过程。数据备份或差异备份包含的事务日志记录足以允许前滚活动的事务作为还原每个备份的一部分。每个备份还包含足以回滚未提交的事务的日志,以使数据库进入事务一致的可用状态。前滚未提交的事务(如果有)并使数据库处于联机状态的过程称为“恢复”。

前滚集

将日志记录更改应用到数据库以使数据及时前滚的过程称为“前滚”。包含所有还原数据的集合称为“前滚集”。前滚集定义为包括一个或多个完整备份(例如数据库备份、部分备份或一组文件备份)的还原操作。如果 RESTORE 语句指定了文件组、文件或页,则前滚集中将仅包括这些项。否则,备份中所有正被还原的文件都将包括在前滚集中。如果完整备份包含日志记录,则还原的数据将使用此日志前滚。

注意注意

如果在还原期间指定了文件组,则还原将包含当前存在的整个文件组。其中包括备份后添加到文件组的所有文件。有关详细信息,请参阅控制在前滚过程中是否创建添加的文件

对于差异备份,如果自创建差异基准后,将任何文件添加到了数据库,则还原差异备份可能会用差异备份中的数据覆盖前滚集中的页。有关详细信息,请参阅使用差异备份

还原差异备份仅在下列情况下才会更新页:前滚集中包含页,备份中包含页,RESTORE 语句可以列出页或其文件,或者 RESTORE 语句不列出任何文件或页。

在完整恢复模式和大容量日志恢复模式下,必须单独备份日志。还原数据和(可选)差异备份后,通常会还原后续日志备份以将数据库恢复到故障点。还原日志备份将对前滚集中的所有页进行前滚。有关日志备份的详细信息,请参阅使用事务日志备份

还原顺序

还原方案使用一个或多个还原步骤(操作)来实现,这称为“还原顺序”。每个操作与不同的 Transact-SQL RESTORE 语句对应。还原顺序将受影响的数据在一个或多个还原阶段中移动。

有关 Transact-SQL 还原顺序以及如何对其进行构造的详细信息,请参阅使用 SQL Server 数据库还原顺序

还原阶段

还原是一个多阶段过程。还原可能涉及的阶段包括数据复制、重做(前滚)以及撤消(回滚)阶段:

  • 数据复制阶段涉及从数据库的备份介质将所有数据、日志和索引页复制到数据库文件中。

  • 重做阶段将记录的事务应用到从备份复制的数据,以将这些数据前滚到恢复点。在此点,数据库通常有未提交的事务,并处于不可用的状态。在这种情况下,恢复数据库操作就包括撤消阶段。

  • 撤消阶段(恢复的第一部分)将回滚任何未提交的事务并使数据库可供用户使用。回滚阶段后将无法还原后续的备份。

本节其余部分将详细介绍这些阶段。

数据复制阶段

还原过程的第一个阶段为“数据复制阶段”。在数据复制阶段,将对要还原的数据库、文件或页中的内容进行初始化。此阶段执行的操作包括使用完整备份或差异备份来还原数据库、文件和页。

数据复制阶段涉及从一个或多个完整备份和(可选)差异备份复制数据,然后将受影响的数据库、文件或页中的内容重置到被备份捕获的时间。

前滚集中最早的文件或页将决定下一阶段(重做,即前滚)的起点。

重做阶段(前滚)

“重做”(即“前滚”)是指重做对前滚集中的数据记录的更改以使数据及时前滚的过程。为了完成前滚,SQL Server 数据库引擎 按照还原日志备份的方式并从完整备份中的日志开始处理日志备份。

还原能够避免不必要的前滚。通常,如果数据在备份时为只读并且现在仍为只读,则没有必要前滚并将跳过。

恢复点

回滚的目的是将数据返回至其在恢复点的原始状态。“恢复点”是用户指定将数据集恢复到的点。在完整恢复模式下,可以将恢复点指定为特定时间点、标记的事务或日志序列号。在大容量日志恢复模式下,仅当上次日志备份以来尚未执行大容量操作时,才可还原到某个时间点。

重做一致性

在重做阶段,始终将数据前滚到与数据库在恢复点的状态保持“重做一致性”的点。所有数据都已前滚至可执行撤消的点。

数据库状态由主文件定义,如下所示:

  • 如果正在还原主文件,则恢复点将确定整个数据库的状态。例如,如果正在将数据库恢复到刚好在意外删除表之前的时点,则必须将整个数据库还原到同一时点。

  • 如果不还原主文件,则数据库状态已知,并且还原的数据前滚到与数据库事务一致的恢复点。SQL Server 强制实施这一点。

但是,数据库可能包含在恢复点处未提交的事务所做的更改。对于联机还原,数据将恢复到与数据库联机部分的当前状态一致的时点。

差异备份将向前跳到进行差异备份的时间点。前滚集中的页将由差异备份中较新的页覆盖。

撤消(回滚)阶段和恢复

在重做阶段已前滚所有日志事务后,数据库中通常包含在恢复点处未提交的事务所做的更改。这会导致前滚数据在事务上不一致。恢复过程通过打开事务日志来标识未提交的事务。通过回滚未提交的事务以将它们撤消,除非它们持有防止其他事务查看事务上不一致数据的锁。此步骤称为“撤消”(或“回滚”)阶段。如果数据在恢复过程开始时在事务方面已经是一致的,则将跳过撤消阶段。在使数据库事务一致后,恢复操作使数据库联机。

在一个或多个备份已还原后,恢复通常会包含重做和撤消两个阶段。每个完整备份和差异备份都包含足够的事务日志记录,以便将该备份中的数据恢复到自我一致的状态。

注意注意

在崩溃恢复或数据库镜像故障转移期间,SQL Server 2005 Enterprise Edition 及更高版本允许用户在撤消阶段访问数据库。这称为“快速恢复”。快速恢复是可能的,因为崩溃发生时未提交的事务重新获得它们在崩溃前所持有的所有锁。回滚这些事务时,事务的锁可以保护它们免受用户的干扰。

RECOVERY 和 NORECOVERY 选项与还原阶段的关系

根据特定 RESTORE 语句是否指定了 WITH NORECOVERY,该语句会在重做阶段之后结束或继续完成撤消阶段,如下所示:

  • WITH RECOVERY 包含重做和撤消两个阶段,并可以恢复数据库;不能还原其他备份。这是默认设置。

    如果前滚集前滚得不够远,无法与数据库一致,则不会出现撤消阶段。数据库引擎将发出错误,恢复将停止。

    如果整个前滚集与数据库一致,则执行恢复,并且可使数据库联机。

  • WITH NORECOVERY 省略撤消阶段以保留未提交的事务。省略撤消阶段允许还原其他备份以将数据库进一步前滚。有时,RESTORE WITH NORECOVERY 会将数据前滚到其与数据库一致的位置。在这种情况下,数据库引擎将发出信息性消息,声明现在可以使用 RECOVERY 选项恢复前滚集。

    有关前滚集的信息,请参阅了解 SQL Server 中备份的还原和恢复工作方式

注意注意

第三种方法 WITH STANDBY 不在本主题的范围内。

有关这些 RESTORE 选项的深入说明,请参阅 RESTORE (Transact-SQL)

恢复路径

“恢复路径”是指一组唯一的转换操作,在数据库不断变化的同时使数据库保持一致。有关恢复路径和恢复分叉、恢复分支的相关概念的信息,请参阅恢复路径