## 实验环境 此次实验的环境如下 - MySQL 5.7.25 - Redhat 6.10 - binlog模式采用row模式 前面的一些章节我们对mysqldump常用命令进行了讲解 这个专题的内容为mysqlbinlog命令的详解 mysqlbinlog是MySQL中用来处理binlog的工具 上节的内容为新建一个备份策略 这节内容讲如何使用mysqldump恢复MySQL ## 1. 还原策略 我们假设周五早上9点发生了故障导致无法打开 我们现在需要将其恢复到最近的时间点 ### 1.1 还原周日零点的备份 **操作系统命令行** ``` shell> mysql -h127.0.0.1 -usystem -P3306 -p < /tmp/backup_sunday_0_AM.sql ``` **mysql命令行** ``` shell> mysql -h127.0.0.1 -usystem -P3306 -p mysql>source /tmp/backup_sunday_0_AM.sql ``` ### 1.2 还原周日零点直到周五零点的备份 我们假设这期间总共生成5个二进制文件 ``` shell> mysqlbinlog mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.000004 mysql-bin.000005 | mysql -h127.0.0.1 -usystem -P3306 -p ``` 注意,需要将所有需要的二进制文件写在一起,不可分多次 如果在开始备份时没有指定--flush-logs参数,则需要首先查看备份时所处的位置 ``` -- Position to start replication or point-in-time recovery from -- CHANGE MASTER TO MASTER_LOG_FILE='masterbin.000001,MASTER_LOG_POS=100; ``` 之后针对该二进制文件进行基于位置点的恢复 ``` mysqlbinlog --start-position=100 /path/to/log/master-bin.000001 | mysql -h127.0.0.1 -usystem -P3306 -p ``` ### 1.3 恢复至最新状态 如果损坏数据库的二进制文件还存在,则可利用其进行恢复 假设周五零点到九点的二进制文件为mysql-bin.000006 mysql-bin.000007 则可以使用如下命令 ``` shell> mysqlbinlog mysql-bin.000006 mysql-bin.000007 | mysql -h127.0.0.1 -usystem -P3306 -p ``` #### 1.3.1 基于时间点恢复 这里我们同样可以恢复到早上8点 首先使用mysqlbinglog查看早上8点在哪个二进制文件中 这里假设在mysql-bin.000007 中 之后用如下语句恢复 ``` mysqlbinlog --stop-datetime="2019-04-16 08:00:00" /path/to/log/master-bin.000007 | mysql -h127.0.0.1 -usystem -P3306 -p ``` 也可以指定起始时间 ``` mysqlbinlog --start-datetime="2019-04-16 08:00:00" /path/to/log/master-bin.000007 | mysql -h127.0.0.1 -usystem -P3306 -p ``` #### 1.3.2 基于事件位置恢复 我们同样可以通过事件的位置来进行恢复 我们假设一个drop表的操作发生在master-bin.000007的位置100处 我们可以使用下面语句 ``` mysqlbinlog --stop-position=100 /path/to/log/master-bin.000001 | mysql -h127.0.0.1 -usystem -P3306 -p ``` ## 2. 参考链接 [https://dev.mysql.com/doc/refman/5.7/en/backup-and-recovery.html](https://dev.mysql.com/doc/refman/5.7/en/backup-and-recovery.html) 好了 今天的内容就说到这里,下节再见