当前位置: 首页 > 科技观察

使用binlog2sql快速闪回误删数据——别拿豆包当干粮

时间:2023-03-15 11:19:59 科技观察

今天抽空给大家分享一篇使用binlog2sql闪回工具恢复误删数据的文章。我们都知道binlog的作用就是备份和恢复,完成MySQL的主从复制功能。mysqlbinlog工具可用于根据时间点或位置偏移来恢复数据。在生产环境中经常会遇到误删改错数据的情况。我们都知道Oracle数据库有闪回功能,而MySQL本身没有闪回功能,但是我们可以使用binlog2sql来完成。我们都知道binlog是以event为单位记录数据库变化的数据信息,而flashback可以帮助我们重现这些变化的数据信息之前的操作。也就是说对于insert操作,会生成delete语句,否则delete操作会生成insert语句。对于更新操作,也会生成相反的更新语句。该工具只能在binlog格式为行模式时使用。下面是实战练习:binlog2sql工具下载地址:https://github.com/danfengcao/binlog2sql第一步:准备环境,安装各种依赖工具包列表python-pip,PyMySQL,python-mysql-replication,wheelargparse第二步:解压binlog2sql软件,命令如下:unzipbinlog2sql-master.zipcdbinlog2sql-masterpipinstall–rrequirements.txt第三步:使用pythonbinlog2sql.py--help命令查看重要参数的使用;-B,--flashback生成backRoll语句--start-file待解析的binlog文件--start-positionbinlog解析起始位置--stop-positionbinlog解析结束位置--start-datetimefrom从哪个时间点开始解析binlog,格式必须是datetime--stop-datetimebinlog在哪个时间点停止解析,格式必须是datetime-d,--databases只输出目标db的sql-t,--tables只输出目标表的sql第四步:开始模拟数据删除先删除zs库root@db14:26下t表中的数据:[zs]>select*fromt;+----+------+--------+|id|名称|地址|+----+------+--------+|1|aaa|bj||2|bbb|sh||3|ccc|gz||4|ddd|sy||5|eee|fj|+----+------+---------+5rowsinset(0.00sec)root@db14:26:[zs]>deletefromt;QueryOK,5rowsaffected(0.04sec)root@db14:27:[zs]>select*fromt;Emptyset(0.00sec)步骤5:需要创建闪回用户createuser'zs_test'@'%'identifiedby'123456';授予选择,复制ionslave,replicationclienton*.*to'zs_test'@'%';刷新权限;第六步:判断当前binlog文件及位置locationroot@db14:41:[zs]>showmasterstatus;+--------------------+----------+------------+------------------+--------------------------------------+|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.000002Positionoffset:2091第七步:需要预估时间,误操作的时间范围应该在下午2:20到2:30之间命令如下:pythonbinlog2sql.py-h192.168.56.102-P3306-uzs_test-p123456-dzs-tt--start-file='mysql-binlog.000002'--start-datetime='2017-11-3014:20:00'--stop-datetime='2017-11-3014:30:00'输出结果:DELETEFROMzs.tWHEREaddress='bj'ANDid=1ANDname='aaa'LIMIT1;#start1214end1427time2017-11-3014:27:46DELETEFROMzs.tWHEREaddress='sh'ANDid=2ANDname='bbb'LIMIT1;#start1214end1427time2017-11-3014:27:46DELETEFROMzs.tWHEREaddress='gz'ANDid=3ANDname='ccc'LIMIT1;#start1214end1427time2017-11-7:301446DELETEFROMzs.tW='sy'ANDid=4ANDname='ddd'LIMIT1;#start1214end1427time2017-11-3014:27:46DELETEFROMzs.tWHEREaddress='fj'ANDid=5ANDname='eee'LIMIT1;#start1214end1427time2017-11-3014:27:2746从parse结果中得知,误操作sql的位置在1214到1427之间;这样可以进一步过滤,使用闪回方式生成回滚sql;命令如下:pythonbinlog2sql.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@node3binlog2sql]#catt_rollback.sqlINSERTINTO`zs`.`t`(`address`,`id`,`name`)VALUES('fj',5,'eee');#start1214end1427time2017-11-3014:27:46INSERTINTO`zs`.`t`(`address`,`id`,`name`)VALUES('sy',4,'ddd');#start1214end1427time2017-11-3014:27:46INSERTINTO`zs`.`t`(`address`,`id`,`name`)VALUES('gz',3,'ccc');#start1214end1427time2017-11-3014:27:46INSERTINTO`zs`.`t`(`address`,`id`,`name`)VALUES('sh',2,'bbb');#start1214end1427time2017-11-3014:27:46INSERTINTO`zs`.`t`(`address`,`id`,`name`)VALUES('bj',1,'aaa');#start1214end1427time2017-11-3014:27:46步骤8:应用回滚文件并恢复数据。命令如下:/usr/local/mysql/bin/mysql-uroot-proot123zsselect*fromt;+----+------+--------+|id|名称|地址|+----+------+--------+|1|aaa|bj||2|bbb|sh||3|ccc|gz||4|ddd|sy||5|eee|fj|+----+------+--------+5rowsinset(0.00sec)验证恢复数据成功!工具虽小,但功能却很强大。我们要善于发现身边的资源,利用这些武器来帮助我们学习MySQL数据库!以后老张会继续分享新的干货,供大家参考!