今儿抽出时间,给大家分享一篇利用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,wheelargparse

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

    unzipbinlog2sql-master.zipcdbinlog2sql-masterpipinstall–rrequirements.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@db14:26:[zs]>select*fromt;+----+------+---------+|id|name|address|+----+------+---------+|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)

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

    createuser'zs_test'@'%'identifiedby'123456';grantselect,replicationslave,replicationclienton*.*to'zs_test'@'%';flushprivileges;

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

    root@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.000002

位置偏移量: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-3014:27:46DELETEFROMzs.tWHEREaddress='sy'ANDid=4ANDname='ddd'LIMIT1;#start1214end1427time2017-11-3014:27:46DELETEFROMzs.tWHEREaddress='fj'ANDid=5ANDname='eee'LIMIT1;#start1214end1427time2017-11-3014:27:46

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

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

    /usr/local/mysql/bin/mysql-uroot-proot123zs<t_rollback.sql

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

    root@db15:09:[zs]>select*fromt;+----+------+---------+|id|name|address|+----+------+---------+|1|aaa|bj||2|bbb|sh||3|ccc|gz||4|ddd|sy||5|eee|fj|+----+------+---------+5rowsinset(0.00sec)

验证恢复数据成功!

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