# 7.5.1 使用二进制日志的时间点恢复

本节介绍使用二进制日志执行时间点恢复的一般思路。下一节,第 7.5.2 节,“使用事件位置的时间点恢复”, 以实例详细说明操作。

笔记

本节和下一节中的许多示例都使用mysql客户端处理生成的二进制日志输出mysqlbinlog.如果您的二进制日志包含\0(null) 字符,该输出不能被mysql除非你用--二进制模式选项。

时间点恢复的信息来源是完整备份操作后生成的一组二进制日志文件。因此,要允许服务器恢复到某个时间点,必须在其上启用二进制日志记录,这是 MySQL 8.0 的默认设置(请参阅第 5.4.4 节,“二进制日志”)。

要从二进制日志中恢复数据,您必须知道当前二进制日志文件的名称和位置。默认情况下,服务器在数据目录中创建二进制日志文件,但可以使用指定路径名--log-bin将文件放置在不同位置的选项。要查看所有二进制日志文件的列表,请使用以下语句:

mysql> SHOW BINARY LOGS;

要确定当前二进制日志文件的名称,请发出以下语句:

mysql> SHOW MASTER STATUS;

mysqlbinlog实用程序将二进制日志文件中的事件从二进制格式转换为文本,以便可以查看或应用它们。mysqlbinlog具有用于根据事件时间或事件在日志中的位置选择二进制日志部分的选项。看第 4.6.9 节,“mysqlbinlog - 处理二进制日志文件的实用程序”.

应用二进制日志中的事件会导致它们所代表的数据修改被重新执行。这可以在给定的时间跨度内恢复数据更改。要应用二进制日志中的事件,请处理mysqlbinlog使用输出mysql客户:

$> mysqlbinlog binlog_files | mysql -u root -p

如果二进制日志文件已经加密,这可以从 MySQL 8.0.14 开始,mysqlbinlog不能像上面的例子那样直接读取它们,但是可以使用--从远程服务器读取(-R) 选项。例如:

$> mysqlbinlog --read-from-remote-server --host=host_name --port=3306  --user=root --password --ssl-mode=required  binlog_files | mysql -u root -p

在这里,选项--ssl 模式=必需已用于确保二进制日志文件中的数据在传输过程中受到保护,因为它被发送到mysqlbinlog以未加密的格式。

当您需要确定事件时间或位置以在执行事件之前选择部分日志内容时,查看日志内容会很有用。要查看日志中的事件,请发送mysqlbinlog输出到分页程序:

$> mysqlbinlog binlog_files | more

或者,将输出保存在文件中并在文本编辑器中查看文件:

$> mysqlbinlog binlog_files > tmpfile
$> ... edit tmpfile ...

编辑文件后,应用如下内容:

$> mysql -u root -p < tmpfile

如果您在 MySQL 服务器上应用了多个二进制日志,请使用单个连接来应用您要处理的所有二进制日志文件的内容。这是一种方法:

$> mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

另一种方法是将整个日志写入单个文件,然后处理该文件:

$> mysqlbinlog binlog.000001 >  /tmp/statements.sql
$> mysqlbinlog binlog.000002 >> /tmp/statements.sql
$> mysql -u root -p -e "source /tmp/statements.sql"