利用binlog2sql快速闪回误删除数据 - 别拿豆包不当干粮

发布时间:2025-05-21 21:27:50 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:今儿抽出时间,给大家分享一篇利用binlog2sql闪回工具,来恢复误删除的数据。我们都知道binlog的作用是备份恢复和完成MySQL的主从复制功能。利用mysqlbinlog工具可以进行基于时间点或者位置偏移量的数据恢复工作,在生产环境中遇到误删除,改错数据的情况,那是常有的事儿。我们都知道Oracle数据库

今儿抽出时间,给大家分享一篇利用binlog2sql闪回工具,来恢复误删除的数据。我们都知道binlog的作用是备份恢复和完成MySQL的主从复制功能。利用mysqlbinlog工具可以进行基于时间点或者位置偏移量的数据恢复工作,在生产环境中遇到误删除,改错数据的情况,那是常有的事儿。我们都知道Oracle数据库有闪回功能,而MySQL本身没有自带闪回,但我们可以使用binlog2sql来完成这项工作。

我们都知道binlog是以event作为单位,来记录数据库变更的数据信息,闪回就是可以帮助我们重现这些变化数据信息之前的操作。也就是说对于insert操作,会生成delete语句,反之delete操作,会生成insert语句。对于update操作,也会生成相反的update语句。这款工具只能使用在binlog格式为row模式下。

下面进行实战演练:

binlog2sql工具的下载地址: https://github.com/danfengcao/binlog2sql

***步:环境准备安装各种依赖的工具包列表

python-pip , PyMySQL , python-mysql-replication, wheel argparse 

第二步:解压binlog2sql软件,命令如下

unzip  binlog2sql-master.zip cd binlog2sql-master pip install –r requirements.txt

第三步:通过python binlog2sql.py --help命令,来查看重要参数的使用;

-B, --flashback 生成回滚语句

--start-file 需要解析的binlog文件

--start-position 解析binlog的起始位置

--stop-position解析binlog的结束位置

--start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime

--stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime

-d, --databases 只输出目标db的sql

-t, --tables 只输出目标tables的sql

第四步:开始模拟数据删除

首先删除掉zs库下,t表中的数据

root@db 14:26:  [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ |  1 | aaa  | bj      | |  2 | bbb  | sh      | |  3 | ccc  | gz      | |  4 | ddd  | sy      | |  5 | eee  | fj      | +----+------+---------+ 5 rows in set (0.00 sec)  root@db 14:26:  [zs]> delete from t; Query OK, 5 rows affected (0.04 sec)  root@db 14:27:  [zs]> select * from t; Empty set (0.00 sec)

第五步:需要创建一个闪回用户

create user zs_test@% identified by 123456; grant select,replication slave,replication client on *.* to zs_test@% ; flush privileges;

第六步:确定当前binlog文件和position位置

root@db 14:41:  [zs]> show master status; +---------------------+----------+--------------+------------------+------------------------------------------+ | File                | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        | +---------------------+----------+--------------+------------------+------------------------------------------+ | mysql-binlog.000002 |     2091 |              |                  | e10f0ead-d595-11e7-82cb-080027cd683a:1-8 | +---------------------+----------+--------------+------------------+------------------------------------------+

可以看到当前binlog是:mysql-binlog.000002

位置偏移量:2091

第七步:需要预估下时间,误操作的时间范围应该在下午2点20分到2点30分之间。命令如下:

python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file=mysql-binlog.000002 --start-datetime=2017-11-30 14:20:00 --stop-datetime=2017-11-30 14:30:00

输出结果:

DELETE FROM zs.t WHERE address=bj AND id=1 AND name=aaa LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46 DELETE FROM zs.t WHERE address=sh AND id=2 AND name=bbb LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46 DELETE FROM zs.t WHERE address=gz AND id=3 AND name=ccc LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46 DELETE FROM zs.t WHERE address=sy AND id=4 AND name=ddd LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46 DELETE FROM zs.t WHERE address=fj AND id=5 AND name=eee LIMIT 1; #start 1214 end 1427 time 2017-11-30 14:27:46

从解析结果中我们了解到,误操作sql的位置是在1214~1427之间;这样就可以进一步过滤,使用flashback模式生成回滚sql;

命令如下:

python binlog2sql.py -h192.168.56.102 -P3306 -uzs_test -p123456 -dzs -tt --start-file=mysql-binlog.000002 --start-position=1214 --stop-position=1427 -B >t_rollback.sql 

查看闪回导出文件:

[root@node3 binlog2sql]# cat t_rollback.sql  INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES (fj, 5, eee); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES (sy, 4, ddd); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES (gz, 3, ccc); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES (sh, 2, bbb); #start 1214 end 1427 time 2017-11-30 14:27:46 INSERT INTO `zs`.`t`(`address`, `id`, `name`) VALUES (bj, 1, aaa); #start 1214 end 1427 time 2017-11-30 14:27:46

第八步:应用回滚文件,恢复数据。命令如下:

/usr/local/mysql/bin/mysql -uroot -proot123 zs < t_rollback.sql

第九步:检验恢复数据是否成功

root@db 15:09:  [zs]> select * from t; +----+------+---------+ | id | name | address | +----+------+---------+ |  1 | aaa  | bj      | |  2 | bbb  | sh      | |  3 | ccc  | gz      | |  4 | ddd  | sy      | |  5 | eee  | fj      | +----+------+---------+ 5 rows in set (0.00 sec)

验证恢复数据成功!

工具虽小,但功能很强大,我们要善于发现周围的资源,利用这些武器,来帮助我们学习MySQL数据库!今后老张会继续分享新的干货,供大家学习参考! 

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!