执行数据库完整还原(完整恢复模式)

数据库完整还原的目的是还原整个数据库。整个数据库在还原期间处于脱机状态。在数据库的任何部分变为联机之前,必须将所有数据恢复到同一点,即数据库的所有部分都处于同一时间点并且不存在未提交的事务。

在完整恢复模式下,数据库可以还原到特定时间点。时间点可以是最新的可用备份、特定的日期和时间或者标记的事务。

安全说明安全说明

建议您不要从未知源或不可信源附加或还原数据库。这些数据库可能包含执行非预期 Transact-SQL 代码的恶意代码,或通过修改架构或物理数据库结构导致错误。使用来自未知源或不可信源的数据库前,请在非生产服务器上针对数据库运行 DBCC CHECKDB,然后检查数据库中的代码,例如存储过程或其他用户定义代码。

还原完整数据库

通常,将数据库恢复到故障点分为下列基本步骤:

  1. 备份活动事务日志(称为日志尾部)。此操作将创建结尾日志备份。如果活动事务日志不可用,则该日志部分的所有事务都将丢失。

    重要说明重要提示

    在大容量日志恢复模式下,备份任何包含大容量日志操作的日志都需要访问数据库中的所有数据文件。如果无法访问该数据文件,则不能备份事务日志。在这种情况下,您必须手动重做自最近备份日志以来所做的所有更改。

    有关详细信息,请参阅结尾日志备份

  2. 还原最新完整数据库备份而不恢复数据库 (RESTORE DATABASE database_name WITH NORECOVERY)。

  3. 如果存在差异备份,则还原最新的差异备份而不恢复数据库 (RESTORE DATABASE database_name FROM differential_backup_device WITH NORECOVERY)。

  4. 从还原备份后创建的第一个事务日志备份开始,使用 NORECOVERY 依次还原日志。

  5. 恢复数据库 (RESTORE DATABASE database_name WITH RECOVERY)。此步骤也可以与还原上一次日志备份结合使用。

  6. 数据库完整还原通常可以恢复到日志备份中的某一时间点或标记的事务。但是,在大容量日志恢复模式下,如果日志备份包含大容量更改,则不能进行时点恢复。有关详细信息,请参阅将数据库还原到备份中的某个时间点

下图显示了这一过程。故障发生后 (1),将创建结尾日志备份 (2)。接着,将数据库还原到该故障点。这涉及到还原数据库备份、后续差异备份以及在差异备份后执行的每个日志备份,包括结尾日志备份。

将数据库完全还原到故障的时间点

还原整个数据库时,应使用单一还原顺序。下面的示例说明还原顺序中用于将数据库还原到故障点的数据库完整还原方案的关键选项。还原顺序由通过一个或多个还原阶段来移动数据的一个或多个还原操作组成。将省略与此目的不相关的语法和详细信息。

数据库将还原并前滚。数据库差异用于减少前滚时间。此还原顺序用于避免丢失工作;上次还原的备份为结尾日志备份。

还原顺序的基本 RESTORE 语法是:

  1. RESTORE DATABASE database FROM full database backup WITH NORECOVERY;

  2. RESTORE DATABASE database FROM full_differential_backup WITH NORECOVERY;

  3. RESTORE LOG database FROM log_backup WITH NORECOVERY;

    对于其他每个日志备份,重复此还原日志步骤。

  4. RESTORE DATABASE database WITH RECOVERY;

示例

对于以下示例,AdventureWorks 示例数据库已设置为在数据库备份之前使用完整恢复模式。此示例将创建 AdventureWorks 数据库的结尾日志备份。接下来,示例将还原较早的完整数据库备份和日志备份,然后还原结尾日志备份。示例将在最后的单独步骤中恢复数据库。

注意注意

此示例使用在完整数据库备份的“在完整恢复模式下使用数据库备份”部分中创建的数据库备份和日志备份。

此示例以 ALTER DATABASE 语句开头,该语句将恢复模式设置为 FULL。

USE master;
--Create tail-log backup.
BACKUP LOG AdventureWorks 
TO DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'  
   WITH NORECOVERY; 
GO
--Restore the full database backup (from backup set 1).
RESTORE DATABASE AdventureWorks 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak' 
  WITH FILE=1, 
    NORECOVERY;

--Restore the regular log backup (from backup set 2).
RESTORE LOG AdventureWorks 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak' 
  WITH FILE=2, 
    NORECOVERY;

--Restore the tail-log backup (from backup set 3).
RESTORE LOG AdventureWorks 
  FROM DISK = 'Z:\SQLServerBackups\AdventureWorksFullRM.bak'
  WITH FILE=3, 
    NORECOVERY;
GO
--recover the database:
RESTORE DATABASE AdventureWorks WITH RECOVERY;
GO

恢复到故障点

恢复到时间点

在完整恢复模式下,数据库可以还原到日志备份内的特定时间点。时间点可以是特定的日期和时间、标记的事务或日志序列号 (LSN)。有关详细信息,请参阅将数据库还原到备份中的某个时间点

对 SQL Server 早期版本中备份的支持

在 SQL Server 2008 中,可以还原使用 SQL Server 2000、SQL Server 2005 或 SQL Server 2008 创建的数据库备份。但是,SQL Server 2008 无法还原使用 SQL Server 2000 或 SQL Server 2005 创建的 mastermodelmsdb 备份。此外,任何早期版本的 SQL Server 都无法还原 SQL Server 2008 备份。

SQL Server 2008 使用与早期版本不同的默认路径。因此,若要还原在 SQL Server 2000 或SQL Server 2005 备份的默认位置创建的数据库,必须使用 MOVE 选项。有关新默认路径的信息,请参阅 SQL Server 的默认实例和命名实例的文件位置

注意注意

有关如何将使用 SQL Server 版本 7.0 或早期版本创建的数据库升级到 SQL Server 2005 的信息,请参阅从 SQL Server 7.0 或更早版本复制数据库

更改历史记录

更新的内容

在“还原完整数据库”部分,更正步骤 3 中还原差异备份的语法。

在“还原完整数据库”部分,更正用于创建结尾日志备份的示例代码。