通过二进制日志进行时点恢复

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年7月24日 (一) 08:57的版本 (创建页面,内容为“本节介绍了使用二进制日志执行时点恢复的一般思路。 注意 使用mysql客户端来处理由mysqlbinlog生成的二进制日志输出。如果你的二进制日志包含\0(空字符),那么除非你使用--binary-mode选项调用mysql,否则无法解析该输出。 时点恢复的信息来源是在完全备份操作之后生成的一组二进制日志文件。因此,要允许将服务器恢复到某个时点,必须在服务…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

本节介绍了使用二进制日志执行时点恢复的一般思路。

注意
使用mysql客户端来处理由mysqlbinlog生成的二进制日志输出。如果你的二进制日志包含\0(空字符),那么除非你使用--binary-mode选项调用mysql,否则无法解析该输出。


时点恢复的信息来源是在完全备份操作之后生成的一组二进制日志文件。因此,要允许将服务器恢复到某个时点,必须在服务器上启用二进制日志记录,这是MySQL 8.0的默认设置。


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

mysql> SHOW BINARY LOGS;


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

mysql> SHOW MASTER STATUS;


mysqlbinlog实用程序将二进制日志文件中的事件从二进制格式转换为文本,以便查看或应用。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比REQUIRED更好,因为它们有助于防止中间人攻击。要实施这些设置,您必须首先确保服务器的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"