使用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>

相关推荐
Meteors.5 小时前
安卓源码阅读——01.grade设置binding为true时,xml如何进行映射
android·xml
_李小白6 小时前
【android opencv学习笔记】Day 26: 滤波算法之低通滤波与图像缩放插值
android·opencv·学习
NiceCloud喜云6 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
我命由我123459 小时前
Bugly - Bugly 基本使用( App 质量追踪平台)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
weiggle10 小时前
第二篇:搭建你的第一个 Compose 项目——开发环境与项目结构
android·前端
阿巴斯甜10 小时前
为什么 AIDL 接口客户端、服务端要写两份一模一样的?
android
亚空间仓鼠11 小时前
Docker容器化高可用架构部署方案(十七)
adb
weiggle11 小时前
第一篇:Jetpack Compose 宣言——为什么 Android 开发需要声明式 UI
android
城管不管13 小时前
什么是Prompt?
android·java·数据库·语言模型·llm·prompt