如何应用事务日志备份 (Transact-SQL)

若要将事务日志备份应用到数据库,必须满足下列条件:

  • 创建最新的完整数据库备份或差异数据库备份之前,数据库必须使用完整恢复模式或大容量日志恢复模式。

  • 还原早期备份时,还原顺序必须指定 WITH NORECOVERY。

  • 必须按照创建日志备份的顺序应用它们,并且日志链没有间隔。除了上一次日志备份,还必须使用 WITH NORECOVERY,如下所示:

    RESTORE LOG <database_name> FROM <backup_device> WITH NORECOVERY;
    
  • 应用上一次日志备份时,可以执行下列操作之一:

    • 作为上一个 BACKUP LOG 语句的一部分恢复数据库:

      RESTORE LOG <database_name> FROM <backup_device> WITH RECOVERY;
      GO
      
    • 等待使用单独的 RESTORE DATABASE 语句恢复数据库:

      RESTORE LOG <database_name> FROM <backup_device> WITH NORECOVERY; 
      RESTORE DATABASE <database_name> WITH RECOVERY;
      GO
      

      通过等待恢复数据库,可以确认已还原所有必需的日志备份。执行时点还原时最好使用该方法。

重要说明重要提示

我们建议您在每个 RESTORE 语句中显式指定 WITH NORECOVERY 或 WITH RECOVERY 以消除混淆。在编写脚本时,这样做尤其重要。

应用事务日志备份

  1. 执行 RESTORE LOG 语句应用事务日志备份,同时指定:

    • 事务日志将应用到的数据库的名称。

    • 将从其中还原事务日志备份的备份设备。

    • NORECOVERY 子句。

    此语句的基本语法如下:

    RESTORE LOG database_name FROM <backup_device> WITH NORECOVERY。

    其中,database_name 是数据库的名称,<backup_device> 是包含要还原的日志备份的设备的名称。

  2. 对必须应用的每个事务日志备份重复步骤 1。

  3. 按照还原顺序还原了最后一个备份之后,可使用以下语句恢复数据库:

    RESTORE database_name WITH RECOVERY

    重要说明重要提示

    如果要创建镜像数据库,则省略恢复步骤。镜像数据库必须仍处于 RESTORING 状态。

示例

默认情况下,AdventureWorks2008R2 数据库使用简单恢复模式。以下示例要求修改数据库以使用完整恢复模式,如下所示:

ALTER DATABASE AdventureWorks2008R2 SET RECOVERY FULL

A. 应用单个事务日志备份

以下示例开始时使用名为 AdventureWorks2008R2_1 备份设备上的完整数据库备份来还原 AdventureWorks2008R2 数据库。然后该示例应用名为 AdventureWorks2008R2_log 备份设备上的第一个事务日志备份。最后,该示例恢复数据库。

RESTORE DATABASE AdventureWorks2008R2
   FROM AdventureWorks2008R2_1
   WITH NORECOVERY
GO
RESTORE LOG AdventureWorks2008R2
   FROM AdventureWorks2008R2_log
   WITH FILE = 1,
   WITH NORECOVERY
GO
RESTORE DATABASE AdventureWorks2008R2
   WITH RECOVERY
GO

B. 应用多个事务日志备份

以下示例开始时使用名为 AdventureWorks2008R2_1 备份设备上的完整数据库备份来还原 AdventureWorks2008R2 数据库。然后该示例逐一使用名为 AdventureWorks2008R2_log 备份设备上的前三个事务日志备份。最后,该示例恢复数据库。

RESTORE DATABASE AdventureWorks2008R2
   FROM AdventureWorks2008R2_1
   WITH NORECOVERY
GO
RESTORE LOG AdventureWorks2008R2
   FROM AdventureWorks2008R2_log
   WITH FILE = 1,
   NORECOVERY
GO
RESTORE LOG AdventureWorks2008R2
   FROM AdventureWorks2008R2_log
   WITH FILE = 2,
   WITH NORECOVERY
GO
RESTORE LOG AdventureWorks2008R2
   FROM AdventureWorks2008R2_log
   WITH FILE = 3,
   WITH NORECOVERY
GO
RESTORE DATABASE AdventureWorks2008R2
   WITH RECOVERY
GO