MySQL备份与恢复// 使用二进制日志进行时间点恢复

1.5.1利用二进制日志进行时间点恢复

本节解释使用二进制日志执行时间点恢复的一般思路。下一部分,第1.5.2节“使用事件位置进行时间点恢复”,通过一个示例详细说明了该操作。

请注意

本节和下一节中的许多示例都使用mysql生成的二进制日志输出mysqlbinlog。如果您的二进制日志包含\ 0(null)字符,输出不能被解析mysql除非你用——二进制模式选择。

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

要从二进制日志中恢复数据,必须知道当前二进制日志文件的名称和位置。默认情况下,服务器在data目录中创建二进制日志文件,但是可以使用——log-bin选项将文件放置在不同的位置。要查看所有二进制日志文件的列表,使用以下语句:

mysql>显示二进制日志

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

查看数据库主状态

mysqlbinlog实用程序将二进制日志文件中的事件从二进制格式转换为文本,以便可以查看或应用它们。mysqlbinlog具有根据事件时间或日志中事件位置选择二进制日志部分的选项。看到mysqlbinlog -处理二进制日志文件的实用程序

应用二进制日志中的事件会导致它们所表示的数据修改被重新执行。这样可以恢复给定时间段内的数据更改。要应用二进制日志中的事件,请处理mysqlbinlog的输出。mysql客户:

壳> mysqlbinlogbinlog_filesmysql -u root -p

如果二进制日志文件已经加密,这可以从MySQL 8.0.14起完成,mysqlbinlog不能像上面的示例那样直接读取它们,但可以使用——read-from-remote-server(- r)选项。例如:

Shell > mysqlbinlog——read-from-remote-server——host=host_name——port=3306——user=root——password——ssl-mode=requiredbinlog_filesmysql -u root -p

这里是选项——ssl-mode =要求已用于确保二进制日志文件中的数据在传输过程中受到保护,因为它被发送到mysqlbinlog以未加密的格式。

当您需要确定事件时间或在执行事件之前选择部分日志内容的位置时,查看日志内容非常有用。要查看日志中的事件,请发送mysqlbinlog输出到分页程序:

壳> mysqlbinlogbinlog_files|更多

或者,将输出保存在一个文件中,并在文本编辑器中查看该文件:

壳> mysqlbinlogbinlog_files> tmpfile shell>…编辑临时文件

将输出保存在文件中是执行删除了某些事件(例如意外事件)的日志内容的准备工作删除表。在执行文件内容之前,可以从文件中删除不需要执行的语句。编辑完文件后,应用如下内容:

Shell > mysql -u root -p < tmpfile

如果要在MySQL服务器上应用多个二进制日志,安全的方法是使用到服务器的单个连接来处理它们。这里有一个例子说明了可能是什么不安全的

Shell > mysqlbinlog binlog000001 | mysql -u root -p #危险!Shell > mysqlbinlog binlog000002 | mysql -u root -p# DANGER!!

使用到服务器的不同连接以这种方式处理二进制日志,如果第一个日志文件包含一个创建临时表语句,第二个日志包含使用临时表的语句。当第一次mysql进程终止,服务器删除临时表。当第二个mysql进程尝试使用表,服务器报告未知的表。

为了避免这样的问题,请使用连接以应用要处理的所有二进制日志文件的内容。这里有一种方法:

Shell > mysqlbinlog binlog000001 binlog。000002 | mysql -u root -p

另一种方法是将整个日志写入单个文件,然后处理该文件:

Shell > mysqlbinlog binlog000001 > /tmp/statements。SQL shell> mysqlbinlog binlog。000002 >> /tmp/statements。SQL shell> mysql -u root -p -e "source /tmp/statements.sql"

当从包含gtid的二进制日志回读时写入转储文件(请参阅使用全局事务标识符进行复制),使用——skip-gtids选项mysqlbinlog,像这样:

Shell > mysqlbinlog——skip-gtid binlog。000001 > /tmp/dump。SQL shell> mysqlbinlog——skip-gtid binlog。000002 >> /tmp/dump。SQL shell> mysql -u root -p -e "source /tmp/dump.sql"