最后一节,7.5.1部分,“时间点恢复使用二进制日志”解释说,使用二进制日志执行的总体想法point-in-time-recovery。部分解释了操作细节的一个例子。
作为一个例子,假设在13:00:00 5月27日,2020年,删除一个表的SQL语句被执行死刑。您可以执行时间点恢复恢复服务器其状态之前删除的表。这些是一些示例步骤来实现:
恢复之前的最后一个创建完整备份时间点感兴趣的(叫它
tp
2020年5月27日,13:00:00在我们的示例中)。完成后,请注意二进制日志位置,你已经恢复了服务器供以后使用,并重新启动服务器。请注意而最后二进制日志位置恢复也显示InnoDB恢复和服务器重启后,不一个可靠的手段获取结束你的恢复日志的位置,可能有DDL事件和non-InnoDB所反映的时间后发生了变化,显示的位置。你的备份和恢复工具应提供你最后二进制日志位置恢复:例如,如果您正在使用mysqlbinlog的任务,检查二进制日志重播的停止位置;如果使用MySQL企业备份,最后二进制日志位置一直保存在备份。看到时间点恢复。
找到精确的二进制日志事件位置对应的时间点,你想恢复数据库。在我们的示例中,假设我们知道的时间的表删除发生(
tp
),我们可以发现日志位置通过检查日志内容在那个时候使用mysqlbinlog实用程序。使用——start-datetime
和——stop-datetime
选项指定一个短的时间内tp
,然后寻找事件的输出。例如:$ > mysqlbinlog——start-datetime =“2020-05-27 12:59:00”——stop-datetime =“2020-05-27”13:06:00 \详细/var/lib/mysql/bin.123456 | grep -C 12 "DROP TABLE" # at 1868 #200527 13:00:30 server id 2 end_log_pos 1985 CRC32 0x8b894489 Query thread_id=8 exec_time=0 error_code=0 use `pets`/*!*/; SET TIMESTAMP=1590598830/*!*/; SET @@session.pseudo_thread_id=8/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=1436549152/*!80005 &~0x1003ff00*//*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C latin1 *//*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; DROP TABLE `cats` /* generated by server */ /*!*/; # at 1985 #200527 13:05:06 server id 2 end_log_pos 2050 CRC32 0x2f8d0249 Anonymous_GTID last_committed=6 sequence_number=7 rbr_only=yes original_committed_timestamp=0 immediate_commit_timestamp=0 transaction_length=0 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=0 (1969-12-31 19:00:00.000000 EST) # immediate_commit_timestamp=0 (1969-12-31 19:00:00.000000 EST) /*!80001 SET @@session.original_commit_timestamp=0*//*!*/; /*!80014 SET @@session.original_server_version=0*//*!*/; /*!80014 SET @@session.immediate_server_version=0*//*!*/; SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/; # at 2050 #200527 13:05:06 server id 2 end_log_pos 2122 CRC32 0x56280bb1 Query thread_id=8 exec_time=0 error_code=0
从输出的mysqlbinlog,
删除表的“宠物”。“猫”
声明中可以找到的部分之间的二进制日志# 1868
和# 1985
,这意味着该声明后1868年日志位置,日志是在1985之后的位置删除表
声明。请注意只使用
——start-datetime
和——stop-datetime
选项来帮助你找到真实的事件感兴趣的职位。使用二进制日志的两个选项指定范围段不推荐应用:有一个失踪的二进制日志事件的风险更高当使用选项。使用——起始位置
和——停止位置
代替。应用事件二进制日志文件到服务器,从日志位置你在步骤1中发现(假定它是1006)和结束位置在步骤2中你发现了之前您感兴趣的时间点(1868):
> mysqlbinlog——起始位置= 1006美元停止位置= 1868 /var/lib/mysql/bin.123456 \ | mysql - u root - p
命令恢复所有事务之前从起始位置到停止位置。因为的输出mysqlbinlog包括
设置时间戳
报表记录每个SQL语句之前,恢复数据和相关的MySQL日志反映原始时代的交易被处决。数据库现在已经恢复到感兴趣的时间点,
tp
,就在桌子上pets.cats
是下降了。除了已经完成的时间点恢复,如果你还想重新制作所有的语句后你感兴趣的时间点,使用mysqlbinlog后再次申请的所有事件
tp
到服务器。在步骤2中我们注意到,在声明中我们想要跳过,日志是在1985位置;我们可以使用它——起始位置
选项,以便以后的任何语句位置包括:/var/lib/mysql/bin. > mysqlbinlog——起始位置= 1985美元123456 \ | mysql - u root - p
数据库已恢复的最新声明二进制日志文件中记录的,但与所选事件跳过。