本节解释使用二进制日志执行时间点恢复的基本思路。下一节,第 9.5.2 节 “使用事件位置进行时间点恢复”,将通过示例详细解释操作过程。
本节和下一节中的许多示例都使用 mysql 客户端来处理由 mysqlbinlog 生成的二进制日志输出。如果您的二进制日志包含 \0
(空)字符,则 mysql 将无法解析该输出,除非您使用 --binary-mode
选项调用它。
时间点恢复的信息来源是在完整备份操作之后生成的二进制日志文件集。因此,要将服务器恢复到某个时间点,必须在其上启用二进制日志记录,这是 MySQL 8.4 的默认设置(请参阅 第 7.4.4 节 “二进制日志”)。
要从二进制日志恢复数据,您必须知道当前二进制日志文件的名称和位置。默认情况下,服务器在数据目录中创建二进制日志文件,但可以使用 --log-bin
选项指定路径名,将文件放在其他位置。要查看所有二进制日志文件的列表,请使用以下语句
mysql> SHOW BINARY LOGS;
要确定当前二进制日志文件的名称,请发出以下语句
mysql> SHOW BINARY LOG STATUS;
mysqlbinlog 实用程序将二进制日志文件中的事件从二进制格式转换为文本格式,以便可以查看或应用它们。 mysqlbinlog 具有根据事件时间或事件在日志中的位置选择二进制日志部分的选项。请参阅 第 6.6.9 节 “mysqlbinlog — 用于处理二进制日志文件的实用程序”。
应用二进制日志中的事件会导致重新执行它们所代表的数据修改。这使得能够恢复给定时间段内的数据更改。要应用二进制日志中的事件,请使用 mysql 客户端处理 mysqlbinlog 输出
$> mysqlbinlog binlog_files | mysql -u root -p
如果二进制日志文件已加密,则 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
是比 REQUIRED
更好的 SSL 模式选择,因为它们有助于防止中间人攻击。要实现其中一种设置,您必须首先确保服务器的 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"