5.3 时间点恢复

您可以使用备份中包含的二进制日志 文件 将数据库恢复到任意时间的状态。该过程假定满足以下条件:

  • 备份的 MySQL 服务器已启用其二进制日志记录。要检查是否满足此条件,请在服务器上执行此查询:

    mysql> SHOW VARIABLES LIKE 'log_bin'; 
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | log_bin       | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)

    如果 的值为 ,log_bin则表示 OFF尚未启用二进制日志记录。有关如何为服务器启用二进制日志记录的 信息,请参阅 二进制日志。

  • 已为服务器创建了一系列备份,通常由完整备份和随后的一系列增量备份组成。该系列中的最后一个备份涵盖了恢复的目标时间点。下面的例子说明了这样一个典型的案例。

  • 您所做的备份系列中的最后一个备份本身包括相关的二进制日志文件。(为确保满足此要求,在创建备份时请勿使用以下任何 MySQL Enterprise Backup 选项: 、、、 --skip-binlog或 。 ) --use-tts--no-locking--start-lsn

这些是时间点恢复的步骤:

  1. 将系列备份还原到服务器,除了系列中的最后一个增量备份(涵盖恢复的目标时间点)。完成后,记下您已将服务器还原到的二进制日志位置。该信息可从backup_variables.txt 服务器恢复的数据目录中的文件中获得:在文件中查找条目的值binlog_position。例如:

    binlog_position=binlog.000012:426

    这意味着在恢复备份系列后,服务器现在位于二进制日志文件中的日志位置 426 binlog.000012。稍后您将需要这些信息。

    笔记

    虽然恢复后的最后一个二进制日志位置也由 InnoDB 显示,但这不是获取恢复的结束日志位置的可靠方法,因为在该时间之后可能发生 DDL 事件和非 InnoDB 更改由显示的位置反映。

  2. 从备份系列中的最后一个增量备份(即覆盖目标恢复时间点的备份)中提取二进制日志。您可以通过使用以下 image-to-backup-dir命令将增量备份映像解压缩到备份目录中来执行此操作;例如:

    mysqlbackup --backup-dir=incr-backup-dir2 --backup-image=incremental_image2.bi image-to-backup-dir

    接下来,进入生成的备份目录(incr-backup-dir2在本例中),并在里面的数据目录下找到二进制日志文件[s](binlog.000012在本例中):

    incr-backup-dir2$ ls datadir
    binlog.000012       ibbackup_logfile  mysql               pets      undo_002
    ...
  3. 使用在最后一步中提取的二进制日志文件 ,将数据库前滚到目标时间点的状态以进行恢复,如 本例所示。然后,使用 mysqlbinlog 实用程序,向服务器重播 二进制日志文件 [s] 中记录的 SQL 活动,从服务器在上述步骤 1 中恢复到的日志位置(在我们的示例中为 426)一直到时间 。使用选项和 选项指定要重放的二进制日志事件的范围 (它表示相应的二进制日志位置 tRtR--start-position--stop-positiontR), 并将输出通过管道传输到mysql客户端:

    mysqlbinlog --start-position="binary-log-position-at-the-end-of-backup-restores" \
             --stop-position="binary-log-position-corresponding-to-tR" \
             binary-log-filename  |   mysql -uadmin -p

    笔记
    • 不建议使用--start-datetime--stop-datetime选项指定要重放的二进制日志段的范围:使用该选项时丢失二进制日志事件的风险更高。使用--start-position and--stop-position代替。

    • 如果您的增量备份中有多个二进制日志文件,并且它们都是将服务器恢复到其状态所必需的 ,则您需要通过一个连接将所有这些文件通过管道传输到服务器;例如: tR

      mysqlbinlog --start-position="426" --stop-position="binary-log-position-corresponding-to-tR" \
      binlog.000012 binlog.000013 binlog.000014 |   mysql -u admin -p

    您也可以先将所有mysqlbinlog输出转储到单个文件,然后通过管道或播放文件到 mysql客户端。

    有关使用二进制日志进行时间点恢复的更多说明,请参阅使用二进制日志进行时间点(增量)恢复

  4. 检查服务器是否已恢复到所需的时间点。