mysql 全备+binlog恢复数据

    假如我在2018-6-10日给数据库做了一次备份,但是在2018-7-3日数据库操作失误,造成了误删或者其他操作,我需要将数据恢复到2018-7-3日的数据,那么即可运用2018-6-10日备份的数据+binlog日志实现数据恢复。(其中binlog恢复的是2018-6-10日-2018-7-3日的数据)

    首先确定你的服务器已开启binlog日志,开通、查看教程请自行百度。

    windows版本的mysql的binlog日志一般在data这个目录下,其中mysql-bin.index这个文件相当于索引文件,而其他的00000x则是记录了除了select查询语句以外的sql语句。

mysql 全备+binlog恢复数据

    为了知道我要从哪里开始恢复,哪里结束恢复,我们需要查看mysql-bin.00000x这些文件,在mysql命令下执行:show binlog events in 'mysql-bin.000001';,即可查看到mysql-bin.000001这个文件的内容,但是通常文件都会很大,我们直接这样查看的话比较慢,也不好观察。所以我们需要将他转成txt文件进行查看,在mysql的bin目录下执行cmd(不是mysql命令终端下):mysqlbinlog mysql-bin.000001 > d:/1.txt,即可将内容写到D盘的1.txt中,但是但是这些都是二进制的文件,所以windows下无法查看,打开1.txt会发现乱码

mysql 全备+binlog恢复数据

则我们需要将他转成普通文件进行查看,具体是在mysqlbinlog命令中增加参数,mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 > d:/1.txt 这样即可解决乱码问题。

    然后我们打开txt文件,查找出现问题的地方,并且找到需要恢复到的地方。

    mysql 全备+binlog恢复数据

    上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令:
      mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
             选项解析:
               IN 'log_name'   指定要查询的binlog文件名(不指定就是第一个binlog文件)
               FROM pos        指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
               LIMIT [offset,] 偏移量(不指定就是0)
               row_count       查询总条数(不指定就是所有行)
             截取部分查询结果:
             *************************** 20. row ***************************
                Log_name: mysql-bin.000021  ----------------------------------------------> 查询的binlog日志文件名
                     Pos: 11197 ----------------------------------------------------------> pos起始点:
              Event_type: Query ----------------------------------------------------------> 事件类型:Query
               Server_id: 1 --------------------------------------------------------------> 标识是由哪台服务器执行的
             End_log_pos: 11308 ----------------------------------------------------------> pos结束点:11308(即:下行的pos起始点)
                    Info: use `zyyshop`; INSERT INTO `team2` VALUES (0,345,'asdf8er5') ---> 执行的sql语句
             *************************** 21. row ***************************
                Log_name: mysql-bin.000021
                     Pos: 11308 ----------------------------------------------------------> pos起始点:11308(即:上行的pos结束点)
              Event_type: Query
               Server_id: 1
             End_log_pos: 11417
                    Info: use `zyyshop`; /*!40000 ALTER TABLE `team2` ENABLE KEYS */
             *************************** 22. row ***************************
                Log_name: mysql-bin.000021
                     Pos: 11417
              Event_type: Query
               Server_id: 1
             End_log_pos: 11510
                    Info: use `zyyshop`; DROP TABLE IF EXISTS `type`
      这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数;
      A.查询第一个(最早)的binlog日志:
        mysql> show binlog events\G; 
      B.指定查询 mysql-bin.000021 这个文件:
        mysql> show binlog events in 'mysql-bin.000021'\G;
      C.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起:
        mysql> show binlog events in 'mysql-bin.000021' from 8224\G;
      D.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,查询10条
        mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10\G;
      E.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,偏移2行,查询10条

        mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10\G;

恢复数据步骤:

一:导入最近一次全备的数据(注意:binlog恢复的数据不能恢复到全备之前的数据,除非用binlog日志回滚)

二:运用binlog日志恢复指定时间段内的数据,其中binlog恢复方式有以下几种方式

    1)按时间恢复--start-datetime

  在mysql的bin目录下执行cmd(不是mysql命令终端下):mysqlbinlog mysql-bin.000001 --start-datetime='2018-07-12 19:50:36' --stop-datetime='2018-07-13 19:23:40' >d:\\test1.sql  将恢复2018-07-12 19:50:36到2018-07-13 19:23:40这个时间段内的sql语句写入到d:\\test1.sql 中,然后我们在Mysql终端下执行:source d:\\test1.sql即可将数据恢复。

mysql 全备+binlog恢复数据

mysql 全备+binlog恢复数据


    1)通过--start-position节点

  在mysql的bin目录下执行cmd(不是mysql命令终端下):mysqlbinlog mysql-bin.000001 --start-datetime='2018-07-12 19:50:36' --stop-datetime='2018-07-13 19:23:40' >d:\\test1.sql  将恢复2018-07-12 19:50:36到2018-07-13 19:23:40这个时间段内的sql语句写入到d:\\test1.sql 中,然后我们在Mysql终端下执行:source d:\\test1.sql即可将恢复恢复2018-07-12 19:50:36到2018-07-13 19:23:40这个时间段内的数据

mysql 全备+binlog恢复数据
atxxx为当前所在的节点,end_log_posXXX为当前结束的节点,下一个操作时间的开始节点。
在mysql的bin目录下执行cmd(不是mysql命令终端下):mysqlbinlog --start-position=4 --stop-position=200268787 ../data/mysql-bin.000001 > d:\\test1.sql  将恢复4到200268787 这个节点内的sql语句写入到d:\\test1.sql 中,然后我们在Mysql终端下执行:source d:\\test1.sql即可将恢复4到200268787 这个节点内的数据

mysql 全备+binlog恢复数据