MySQL 8.0 参考手册  / 第 7 章备份与恢复  / 7.5 时间点(增量)恢复  /  7.5.1 使用二进制日志进行时间点恢复

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

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

笔记

本节和下一节中的许多示例使用 mysql客户端来处理mysqlbinlog生成的二进制日志输出。如果您的二进制日志包含(空)字符,则除非您使用该 选项 调用它,否则mysql\0无法解析该输出。--binary-mode

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

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

mysql> SHOW BINARY LOGS;

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

mysql> SHOW MASTER STATUS;

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

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

$> mysqlbinlog binlog_files | mysql -u root -p

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

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

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

重要的

VERIFY_CA并且 VERIFY_IDENTITY是比 REQUIREDSSL 模式更好的选择,因为它们有助于防止中间人攻击。要实施这些设置之一,您必须首先确保服务器的 CA 证书对您环境中使用它的所有客户端可靠可用,否则将导致可用性问题。请参阅加密连接的命令选项

当您需要确定事件时间或位置以在执行事件之前选择部分日志内容时,查看日志内容会很有用。要从日志中查看事件,请将 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"