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

相关推荐
梦幻通灵6 小时前
Mysql字段判空实用技巧
android·数据库·mysql
龘龍龙9 小时前
Python基础(九)
android·开发语言·python
gjc59210 小时前
MySQL隐蔽 BUG:组合条件查询无故返回空集?深度排查与规避方案
android·数据库·mysql·bug
梨落秋霜10 小时前
Python入门篇【元组】
android·数据库·python
zh_xuan10 小时前
kotlin定义函数和变量
android·开发语言·kotlin
Digitally12 小时前
Android 上的联系人备份和恢复:5 种可靠且方便的方法
android
默|笙13 小时前
【Linux】进程控制(3)进程程序替换
android·linux·运维
国家二级编程爱好者13 小时前
Android Lottie使用,如何自定义LottieView?
android·前端
bst@微胖子13 小时前
CrewAI+FastAPI实现营销战略协助智能体项目
android·数据库·fastapi
子林Android13 小时前
AndroidStudio修改.android、.gradle、.AndroidStudio路径,释放C盘空间
android·android studio