您可以使用备份中包含的二进制日志 文件 将数据库恢复到任意时间的状态。该过程假定满足以下条件:
备份的 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
这些是时间点恢复的步骤:
将系列备份还原到服务器,除了系列中的最后一个增量备份(涵盖恢复的目标时间点)。完成后,记下您已将服务器还原到的二进制日志位置。该信息可从
backup_variables.txt
服务器恢复的数据目录中的文件中获得:在文件中查找条目的值binlog_position
。例如:binlog_position=binlog.000012:426
这意味着在恢复备份系列后,服务器现在位于二进制日志文件中的日志位置 426
binlog.000012
。稍后您将需要这些信息。笔记虽然恢复后的最后一个二进制日志位置也由 InnoDB 显示,但这不是获取恢复的结束日志位置的可靠方法,因为在该时间之后可能发生 DDL 事件和非 InnoDB 更改由显示的位置反映。
从备份系列中的最后一个增量备份(即覆盖目标恢复时间点的备份)中提取二进制日志。您可以通过使用以下
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 ...
使用在最后一步中提取的二进制日志文件 ,将数据库前滚到目标时间点的状态以进行恢复,如
tR
本例所示。然后,使用 mysqlbinlog 实用程序,向服务器重播 二进制日志文件 [s] 中记录的 SQL 活动,从服务器在上述步骤 1 中恢复到的日志位置(在我们的示例中为 426)一直到时间 。使用选项和 选项指定要重放的二进制日志事件的范围 (它表示相应的二进制日志位置tR
--start-position
--stop-position
tR
), 并将输出通过管道传输到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
You can also dump all the mysqlbinlog output to a single file first, and then pipe or play the file to the mysql client.
For more explanations on using the binary log for point-in-time recovery, see Point-in-Time (Incremental) Recovery.
Check that the server has been restored to the desired point in time.