1.5.2使用事件位置的时间点恢复

最后一节,第1.5.1节,“使用二进制日志进行时间点恢复”,说明了使用二进制日志执行时间点恢复的一般思想。本节通过一个例子详细说明了该操作。

例如,假设在2020年3月11日20:06:00左右,执行了一条删除表的SQL语句。您可以执行时间点恢复,将服务器恢复到表删除之前的状态。以下是实现该目标的一些示例步骤:

  1. 还原在感兴趣的时间点(称为TP,在我们的示例中是2020年3月11日20:06:00)。完成后,请注意已将服务器还原到的二进制日志位置,以便以后使用,然后重新启动服务器。

    注意

    而在恢复和服务器重启后,InnoDB也会显示恢复的最后一个二进制日志位置,即获取还原结束日志位置的可靠方法,因为在显示位置所反映的时间之后可能会发生DDL事件和非InnoDB更改。备份和恢复工具应该为您提供恢复的最后一个二进制日志位置:例如,如果您正在使用mysqlbinlog文件对于任务,检查二进制日志重放的停止位置;如果您使用的是MySQL企业备份,那么最后一个二进制日志位置已保存在备份中。看到了吗时间点恢复.

  2. 找到与要还原数据库的时间点对应的精确二进制日志事件位置。在我们的示例中,假设我们知道表删除发生的大致时间(TP),我们可以通过使用mysqlbinlog文件实用程序。使用--开始日期时间--停止日期时间用于指定短时间段的选项TP,然后在输出中查找事件。例如:

    shell>mysqlbinlog--start datetime=“2020-03-11 20:05:00”---stop datetime=“2020-03-11 20:08:00”--verbose\/var/lib/mysql/bin.123456 | grep-C 15“DROP TABLE”/*!80014设置@@session.original_server_version=80019*/*!*/;/*!80014设置@@session.immediate_server_version=80019*/*!*/;SET@@SESSION.GTID#u NEXT='匿名'/*!*/;#在232#200311 20:06:20服务器id 1结束_日志_位置355 CRC32 0x2fc1e5ea查询线程_id=16执行_时间=0错误_代码=0设置时间戳=1583971580/*!*/;设置@@session.pseudo\u thread\u id=16/*!*/;设置@@session.foreign\u key\u checks=1,@@session.sql\u auto\u is\u null=0,@@session.unique\u checks=1,@@session.autocommit=1/*!*/;设置@@session.sql\u mode=1168113696/*!*/;设置@@session.auto\u increment\u increment=1,@@session.auto\u increment\u offset=1/*!*/;/*\C utf8mb4*//*!*/;SET@@session.character\u SET\u client=255,@@session.collation\u connection=255,@@session.collation\u server=255/*!*/;设置@@session.lc\u time\u names=0/*!*/;SET@@session.collation_database=DEFAULT/*!*/;/*!80011设置@@session。默认的\u排序规则为\u utf8mb4=255*/*!*/;删除表“pets”。“cats`/*由服务器生成*/*!*/;#在355ş200311 20:07:48服务器id 1结束ş日志ş位置434 CRC32 0x123d65df匿名şGTID最后一次ş提交=1序列ş编号=2 rbrş仅=无原始ş提交ş时间戳=1583971668462467立即ş提交ş时间戳=1583971668462467事务ş长度=473ş原始ş提交ş时间戳=15839716; 1568462462467(2020-03-11 20:07:48.462467 ED立即提交时间戳=1583971668462467(2020-03-11 20:07:48.462467 EDT)/*!80001设置@@session.original_commit_timestamp=1583971668462467*/*!*/;/*!80014设置@@session.original_server_version=80019*/*!*/;/*!80014设置@@session.immediate_server_version=80019*/*!*/;SET@@SESSION.GTID#u NEXT='匿名'/*!*/;#在434#200311 20:07:48服务器id 1结束_日志_pos828 CRC32 0x57fac9ac查询线程_id=16 exec _time=0 error _code=0 Xid=217使用'pets`/*!*/;设置时间戳=1583971668/*!*/;/*!80013设置@@session.sql\u require\u primary\u key=0*//*!*/;创建桌子狗

    从输出mysqlbinlog文件,的放置表格“pets”。“cats”`语句可以在二进制日志的段之间找到行#第232页#在355,这意味着之后日志位置232,日志位于删除表格声明。

    注意

    只使用--开始日期时间--停止日期时间帮助您找到感兴趣的实际事件位置的选项。不建议使用这两个选项指定要应用的二进制日志段的范围:使用这些选项时,丢失二进制日志事件的风险更高。使用--起始位置--停止位置相反。

  3. 将二进制日志文件中的事件应用到服务器,从步骤1中找到的日志位置开始(假设它是155),到步骤2中找到的位置结束,即之前您感兴趣的时间点(即232):

    shell>mysqlbinlog--start position=155--stop position=232/var/lib/mysql/bin.123456\| mysql-u root-p

    该命令恢复从开始位置到停止位置之前的所有事务。因为mysqlbinlog文件包括设置时间戳在记录每个SQL语句之前,恢复的数据和相关的MySQL日志反映了事务执行的原始时间。

    您的数据库现在已恢复到所关注的时间点,TP,就在桌子前面宠物。猫被扔了。

  4. 如果您还想重新执行所有语句,则会超出已完成的时间点恢复之后您感兴趣的时间点,使用mysqlbinlog文件再次应用之后的所有事件TP到服务器。我们在步骤2中注意到,在我们想要跳过的语句之后,日志位于355位置;我们可以用它来--起始位置选项,以便包含位置后面的任何语句:

    shell>mysqlbinlog--start position=355/var/lib/mysql/bin.123456\| mysql-u root-p

    您的数据库已还原为二进制日志文件中记录的最新语句,但跳过了选定的事件。