• 使用binlog2sql工具闪回恢复被误删除的数据实战


    1)插入测试数据
    [root@localhost:mytest1]>select * from user;
    +----+--------+------------+
    | id | name   | addtime    |
    +----+--------+------------+
    |  1 | 小赵   | 2013-11-11 |
    |  2 | 小钱   | 2014-11-11 |
    |  3 | 小孙   | 2016-11-11 |
    |  4 | 小李   | 2013-11-11 |
    +----+--------+------------+
    4 rows in set (0.00 sec)

    删除两行数据后:
    mysql> select * from user;
    +----+--------+------------+
    | id | name   | addtime    |
    +----+--------+------------+
    |  1 | 小赵   | 2013-11-11 |
    |  4 | 小李   | 2013-11-11 |
    +----+--------+------------+
    2 rows in set (0.00 sec)

    记录binlog的位置

    [root@localhost:mytest1]>show master status;
    +------------------+----------+--------------+------------------+--------------------------------------------------------------------------------------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                                                                                |
    +------------------+----------+--------------+------------------+--------------------------------------------------------------------------------------------------+
    | mysql-bin.000026 |     2463 |

    2)安装binlog2sql

    使用mysql用户解压binlog2sql.zip 到/home/mysql目录
    unzip binlog2sql.zip
    cd binlog2sql

    使用root安装binlog2sql.zip里自带的pymysql等三个包,否则会报ImportError: No module named pymysql等错误
    [root@t3-dtpoc-dtpoc-web04 binlog2sql]# ls
    binlog2sql-master  mysql-replication-0.13  PyMySQL-0.7.11  wheel-0.29.0

    cd PyMySQL-0.7.11
    python setup.py install 

    cd mysql-replication-0.13
    python setup.py install

    cd wheel-0.29.0
    python setup.py install

    cd binlog2sql-master
    cd binlog2sql


    3)使用root执行binlog2sql

    python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'1234' -dmytest -tuser --start-file='mysql-bin.000026' --start-datetime='2023-09-18 14:00:00' --stop-datetime='2023-09-18 14:25:00'> /tmp/raw.sql

    可以看到删除表user数据的sql
    vi /tmp/raw.sql
    USE mytest;
    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(10) DEFAULT NULL,
      `addtime` date,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2013-11-11', 1, '小赵'); #start 9463 end 9721 time 2023-09-18 14:17:24
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2014-11-11', 2, '小钱'); #start 9817 end 10075 time 2023-09-18 14:18:04
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2016-11-11', 3, '小孙'); #start 10171 end 10429 time 2023-09-18 14:18:31
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2013-11-11', 4, '小李'); #start 10525 end 10783 time 2023-09-18 14:18:58
    DELETE FROM `mytest`.`user` WHERE `addtime`='2014-11-11' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 10879 end 11138 time 2023-09-18 14:19:38
    DELETE FROM `mytest`.`user` WHERE `addtime`='2016-11-11' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 10879 end 11138 time 2023-09-18 14:19:38

    4. )根据位置信息,我们确定了误操作sql来自同一个事务,准确位置在10879-11138之间(binlog2sql对于同一个事务会输出同样的start position)。再根据位置过滤,使用 _**-B**_ 选项生成回滚sql,检查回滚sql是否正确。(注:真实场景下,生成的回滚SQL经常会需要进一步筛选。结合grep、编辑器等)

    DELETE FROM `mytest`.`user` WHERE `addtime`='2014-11-11' AND `id`=2 AND `name`='小钱' LIMIT 1; #start 10879 end 11138 time 2023-09-18 14:19:38
    DELETE FROM `mytest`.`user` WHERE `addtime`='2016-11-11' AND `id`=3 AND `name`='小孙' LIMIT 1; #start 10879 end 11138 time 2023-09-18 14:19:38     

    python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'1234' -dmytest -tuser --start-file='mysql-bin.000026' --start-position=10879 --stop-position=11138 -B > /tmp/rollback.sql    

    vi rollback.sql 
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2016-11-11', 3, '小孙'); #start 10879 end 11138 time 2023-09-18 14:19:38
    INSERT INTO `mytest`.`user`(`addtime`, `id`, `name`) VALUES ('2014-11-11', 2, '小钱'); #start 10879 end 11138 time 2023-09-18 14:19:38

            
    5)与业务方确认回滚sql没问题,执行回滚语句。登录mysql,确认回滚成功。

    mysql> source /tmp/rollback.sql;
    Query OK, 1 row affected (0.00 sec)

    Query OK, 1 row affected (0.00 sec)

    mysql> select * from mytest.user;
    +----+--------+------------+
    | id | name   | addtime    |
    +----+--------+------------+
    |  1 | 小赵   | 2013-11-11 |
    |  2 | 小钱   | 2014-11-11 |
    |  3 | 小孙   | 2016-11-11 |
    |  4 | 小李   | 2013-11-11 |
    +----+--------+------------+
    4 rows in set (0.00 sec)

    mysql> 

  • 相关阅读:
    【vue.js】文档解读【day 1】 | 模板语法1
    day35反射&动态代理
    Hadoop完全分布式环境搭建
    执法记录仪如何防抖
    甲烷排放通量的计算
    C++左值引用与右值引用
    安卓magisk刷root权限
    CVPR2020:Seeing Through Fog Without Seeing Fog
    计算机视觉与深度学习 | 视觉里程计理论
    鸿蒙入门05-真机运行“遥遥领先”
  • 原文地址:https://blog.csdn.net/liys0811/article/details/132982569