Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Point-in-Time Recovery Using Binary Log

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

本节解释了使用二进制日志来实现时间点恢复的基本思想。下一节Section 9.5.2, “使用事件位置的时间点恢复”详细解释了操作的详细信息,并提供了示例。

Note

本节和下一节中的许多示例使用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以未加密格式。

Important

VERIFY_CAVERIFY_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"