本节介绍使用二进制日志来执行时间恢复的一般思路。下一节,7.5.2节“使用事件位置的时间点恢复”,用一个例子解释详细的操作。
其中许多例子和下一节使用了mysql客户端处理二进制日志产生的输出mysqlbinlog.如果您的二进制日志包含0.
(null)字符,该输出不能被解析mysql除非您使用——二进制模式
选项。
时间点恢复的信息来源是在完全备份操作之后生成的二进制日志文件集。因此,为了允许服务器恢复到某个时间点,必须在服务器上启用二进制日志记录,这是MySQL 8.0的默认设置(参见第5.4.4节,“二进制日志”).
要从二进制日志中恢复数据,您必须知道当前二进制日志文件的名称和位置。默认情况下,服务器在数据目录中创建二进制日志文件,但是可以使用- 垃圾箱
选项将文件放在不同的位置。要查看所有二进制日志文件的列表,使用下面的语句:
mysql>显示二进制日志;
要确定当前二进制日志文件的名称,发出以下语句:
mysql> SHOW MASTER STATUS;
的mysqlbinlog实用程序将二进制日志文件中的事件从二进制格式转换为文本,以便可以查看或应用它们。mysqlbinlog具有基于事件时间或日志中的事件的位置选择二进制日志的部分的选项。看mysqlbinlog -处理二进制日志文件的实用程序.
应用二进制日志中的事件会导致它们所表示的数据修改被重新执行。这可以恢复给定时间范围内的数据更改。要应用二进制日志中的事件,进程mysqlbinlog输出使用mysql客户:
壳> mysqlbinlogbinlog_files.|mysql -u root -p
如果已加密二进制日志文件,则可以从MySQL 8.0.14开始完成,mysqlbinlog无法直接如上例中读取它们,但可以使用使用的服务器读取它们- Read-From-Remote-Server
(-R.
)选项。例如:
mysqlbinlog——read-from-remote-server——host=主机名--port = 3306 --user = root --password --ssl-mode =必填binlog_files.|mysql -u root -p
在这里,可以选择——ssl-mode =要求
用于确保二进制日志文件中的数据在传输过程中受到保护,因为它被发送到mysqlbinlog以未加密的格式。
当您需要在执行事件之前确定事件的时间或位置以选择部分日志内容时,可以使用查看日志内容的方法。要查看日志中的事件,发送mysqlbinlog输出到分页程序:
壳> mysqlbinlogbinlog_files.|更多的
或者,将输出保存到一个文件中,并在文本编辑器中查看该文件:
壳> mysqlbinlogbinlog_files.> tmpfile shell>…编辑临时文件...
保存文件中的输出是有用的,因为删除了某些事件,例如偶然的事件删除表
.您可以从文件中删除在执行其内容之前不执行的任何语句。编辑文件后,将内容应用如下:
shell> mysql -u root -p
如果要在MySQL服务器上应用多个二进制日志,安全的方法是使用到服务器的单个连接来处理它们。这里有一个例子,说明了什么可能不安全的:
shell> mysqlbinlog binlog.000001 |mysql -u root -p#危险!!shell> mysqlbinlog binlog.000002 |mysql -u root -p#危险!!
处理二进制记录以这种方式使用与服务器的不同连接如果第一个日志文件包含一个问题会导致问题创建临时表
语句和第二个日志包含一个使用临时表的语句。当第一个mysql进程终止,服务器丢弃临时表。第二个mysql流程尝试使用表,服务器报告”未知的表。”
为避免这样的问题,请使用单连接以应用要处理的所有二进制日志文件的内容。这是一种方法:
壳> mysqlbinlog binlog。000001 binlog。000002 | mysql -u root -p
另一种方法是将整个日志写入单个文件,然后处理文件:
壳> mysqlbinlog binlog。000001 > / tmp /语句。SQL shell> mysqlbinlog binlog。000002 > > / tmp /语句。SQL shell> mysql -u root -p -e "source /tmp/statement . SQL "
当从包含gtid的二进制日志中读取时(参见第17.1.3节,“使用全局事务标识符的复制”),用——skip-gtids
选项mysqlbinlog, 像这样:
mysqlbinlog——skip-gtids binlog。000001 > / tmp /转储。SQL shell> mysqlbinlog——skip-gtids binlog。000002 > > / tmp /转储。SQL shell> mysql -u root -p -e "source /tmp/dump.sql"