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

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

在完整恢复模式下,还原数据备份或备份后,必须还原所有后续事务日志备份,然后恢复数据库。 可以将数据库还原到其中一个日志备份中的特定 恢复点 。 恢复点可以是特定的日期和时间、标记的事务或日志序列号(LSN)。

还原数据库时,尤其是在完整恢复模式或大容量日志恢复模式下,应使用单个还原序列。 还原序列由一个或多个还原操作组成,数据在一个或多个还原阶段中移动。

重要

建议不要从未知或不受信任的源附加或还原数据库。 这些数据库可能包含恶意代码,这些代码可能会意外执行 Transact-SQL 代码,或者通过修改架构或物理数据库结构引发故障。 在从未知或不受信任的源使用数据库之前,请在非生产服务器上对数据库运行 DBCC CHECKDB ,并在数据库中检查代码,例如存储过程或其他用户定义的代码。

在本主题中:

注释

有关对早期版本的 SQL Server 备份的支持的信息,请参阅 RESTORE (Transact-SQL) 的“兼容性支持”部分。

将数据库还原到发生故障的时间点

通常,将数据库恢复到故障点涉及以下基本步骤:

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

    重要

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

    有关详细信息,请参阅 Tail-Log 备份(SQL Server)。

  2. 在不恢复数据库的情况下还原最新的完整数据库备份(RESTORE DATABASE database_name FROM backup_device WITH NORECOVERY)。

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

    还原最新的差异备份可以减少必须还原的日志备份数。

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

  5. 恢复数据库(RESTORE DATABASE database_name WITH RECOVERY)。 或者,此步骤可与还原最后一个日志备份结合使用。

下图显示了此还原序列。 发生故障后(1),将创建结尾日志备份(2)。 接下来,数据库将还原到故障点。 这包括还原数据库备份、后续差异备份以及差异备份之后执行的每个日志备份,包括结尾日志备份。

完成数据库还原到故障发生时

注释

将数据库备份还原到其他服务器实例时,请参阅 使用备份和还原复制数据库

基本 Transact-SQL RESTORE 语法

上图中还原序列的基本 RESTORETransact-SQL 语法如下所示:

  1. 还原数据库database完整数据库备份,使用 NORECOVERY;

  2. 还原数据库 databasefull_differential_backup 恢复但不提交;

  3. 使用 NORECOVERY 从 log_backup RESTORE LOG 数据库;

    对每个额外的日志备份重复此还原日志步骤。

  4. 还原数据库database,恢复模式;

示例:恢复至故障发生点(Transact-SQL)

以下 Transact-SQL 示例显示了还原序列中将数据库还原到故障点的基本选项。 该示例创建数据库的结尾日志备份。 接下来,该示例还原完整数据库备份和日志备份,然后还原结尾日志备份。 该示例在单独的最后一个步骤中恢复数据库。

注释

此示例使用完整 数据库备份(SQL Server)中的“使用完整恢复模式下的数据库备份”部分中创建的数据库备份和日志备份。 在数据库备份之前, AdventureWorks2012 示例数据库设置为使用完整恢复模式。

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

将数据库还原到日志备份中的点

在完整恢复模式下,完整数据库还原通常可以恢复到某一时间点、某个标记的事务,或日志备份中的某个LSN。 但是,在大容量日志恢复模式下,如果日志备份包含大容量记录的更改,则无法进行时间点恢复。

示例时间点还原场景

以下示例假设一个任务关键型数据库系统,该系统每天午夜进行完整数据库备份,星期一到星期六每小时进行一次差异数据库备份,并且全天每10分钟进行一次事务日志备份。 若要将数据库恢复到星期三上午 5:19 的状态,请执行以下操作:

  1. 还原周二午夜创建的完整数据库备份。

  2. 还原周三上午 5:00 创建的差异数据库备份。

  3. 应用于周三上午 5:10 创建的事务日志备份。

  4. 应用周三上午 5:20 创建的事务日志备份,指定恢复过程仅适用于上午 5:19 之前发生的事务。

或者,如果数据库需要还原到星期四凌晨 3:04 时的状态,但星期四凌晨 3:00 创建的差异数据库备份不可用,请执行以下操作:

  1. 还原星期三午夜创建的数据库备份。

  2. 还原周四凌晨2点整创建的差异数据库备份。

  3. 将星期四凌晨2点10分到3点之间创建的所有事务日志备份应用到当前数据库。

  4. 应用周四上午 3:10 创建的事务日志备份,在凌晨 3:04 停止恢复过程。

注释

有关时间点还原的示例,请参阅将 SQL Server 数据库还原到时间点(完整恢复模式)。

相关任务

还原完整数据库备份

还原差异数据库备份

还原事务日志备份

使用 SQL Server 管理对象(SMO)还原备份

将数据库还原到日志备份中的某个点

另请参阅

RESTORE (Transact-SQL)
BACKUP (Transact-SQL)
应用事务日志备份 (SQL Server)
sp_addumpdevice (Transact-SQL)
完整数据库备份 (SQL Server)
差异备份 (SQL Server)
备份概述 (SQL Server)
还原和恢复概述 (SQL Server)