相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 236.9 kb
手册页(邮政编码)- 348.5 kb
信息(Gzip)- 3.4 mb
信息(邮政编码)- 3.4 mb
本手册摘录

MySQL 5.7参考手册// 时间点恢复使用事件的位置

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

最后一节,7.5.1部分,“时间点恢复使用二进制日志”解释说,使用二进制日志执行的总体想法point-in-time-recovery。部分解释了操作细节的一个例子。

作为一个例子,假设在13:00:00 5月27日,2020年,删除一个表的SQL语句被执行死刑。您可以执行时间点恢复恢复服务器其状态之前删除的表。这些是一些示例步骤来实现:

  1. 恢复之前的最后一个创建完整备份时间点感兴趣的(叫它tp2020年5月27日,13:00:00在我们的示例中)。完成后,请注意二进制日志位置,你已经恢复了服务器供以后使用,并重新启动服务器。

    请注意

    而最后二进制日志位置恢复也显示InnoDB恢复和服务器重启后,一个可靠的手段获取结束你的恢复日志的位置,可能有DDL事件和non-InnoDB所反映的时间后发生了变化,显示的位置。你的备份和恢复工具应提供你最后二进制日志位置恢复:例如,如果您正在使用mysqlbinlog的任务,检查二进制日志重播的停止位置;如果使用MySQL企业备份,最后二进制日志位置一直保存在备份。看到时间点恢复

  2. 找到精确的二进制日志事件位置对应的时间点,你想恢复数据库。在我们的示例中,假设我们知道的时间的表删除发生(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选项来帮助你找到真实的事件感兴趣的职位。使用二进制日志的两个选项指定范围段不推荐应用:有一个失踪的二进制日志事件的风险更高当使用选项。使用——起始位置——停止位置代替。

  3. 应用事件二进制日志文件到服务器,从日志位置你在步骤1中发现(假定它是1006)和结束位置在步骤2中你发现了之前您感兴趣的时间点(1868):

    > mysqlbinlog——起始位置= 1006美元停止位置= 1868 /var/lib/mysql/bin.123456 \ | mysql - u root - p

    命令恢复所有事务之前从起始位置到停止位置。因为的输出mysqlbinlog包括设置时间戳报表记录每个SQL语句之前,恢复数据和相关的MySQL日志反映原始时代的交易被处决。

    数据库现在已经恢复到感兴趣的时间点,tp,就在桌子上pets.cats是下降了。

  4. 除了已经完成的时间点恢复,如果你还想重新制作所有的语句你感兴趣的时间点,使用mysqlbinlog后再次申请的所有事件tp到服务器。在步骤2中我们注意到,在声明中我们想要跳过,日志是在1985位置;我们可以使用它——起始位置选项,以便以后的任何语句位置包括:

    /var/lib/mysql/bin. > mysqlbinlog——起始位置= 1985美元123456 \ | mysql - u root - p

    数据库已恢复的最新声明二进制日志文件中记录的,但与所选事件跳过。