本节解释了使用二进制日志进行点时恢复的总体想法。下一节,第 9.5.2 节,“使用事件位置进行点时恢复”,将详细解释该操作,包括示例。
本节和下一节中的许多示例都使用 mysql 客户端来处理由 mysqlbinlog 生成的二进制日志输出。如果您的二进制日志包含 \0
(空)字符,那么输出不能被 mysql 解析,除非您使用 --binary-mode
选项调用它。
点时恢复的信息来源是自完整备份操作以来生成的二进制日志文件集。因此,要允许服务器恢复到某个点时,必须在服务器上启用二进制日志记录,这是 MySQL 8.3 的默认设置(见 第 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
更好的选择,因为它们可以防止中间人攻击。要实施这些设置,您必须首先确保服务器的 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"