9.5.1 使用二进制日志进行时间点恢复
本节解释了使用二进制日志来实现时间点恢复的基本思想。下一节Section 9.5.2, “使用事件位置的时间点恢复”详细解释了操作的详细信息,并提供了示例。
本节和下一节中的许多示例使用mysql客户端来处理二进制日志输出,输出由mysqlbinlog生成。如果您的二进制日志包含\0
(null)字符,那么mysql不能解析该输出,除非您使用--binary-mode
选项。
时间点恢复的信息来源是生成于全备份操作后的二进制日志文件集。因此,为了允许服务器恢复到某个时间点,二进制日志必须在服务器上启用,这是MySQL 8.4的默认设置(见Section 7.4.4, “二进制日志”)。
要从二进制日志中恢复数据,您必须知道当前二进制日志文件的名称和位置。默认情况下,服务器将二进制日志文件创建在数据目录中,但可以使用--log-bin
选项将文件夹指定到不同的位置。要查看所有二进制日志文件的列表,请使用以下语句:
mysql> SHOW BINARY LOGS;
要确定当前二进制日志文件的名称,请执行以下语句:
mysql> SHOW BINARY LOG STATUS;
工具mysqlbinlog将二进制日志文件中的事件从二进制格式转换为文本,以便查看或应用。 mysqlbinlog具有选择二进制日志中的事件时间或事件位置的选项。见Section 6.6.9, “mysqlbinlog — 处理二进制日志文件的工具”。
从二进制日志中应用事件将导致数据修改事件的重新执行。这使得恢复数据变化的可能性。要应用二进制日志中的事件,请使用mysqlbinlog输出使用mysql客户端:
$> 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
比较好,因为它们可以防止中间人攻击。要实现这些设置,您必须首先确保服务器的CA证书在您的环境中可靠地可用,以免出现可用性问题。请参阅Command Options for Encrypted Connections。
查看日志内容可以有助于确定事件时间或位置,以便在执行事件之前 Partially 选择日志内容。要查看日志事件,请将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"