binlog2sql用于快速恢复由于误操作丢失的数据。在DBA误操作时,可以把数据库恢复到以前某个时间点(或者说某个binlog的某个pos)。比如忘了带where条件的update、delete操作,传统的恢复方式是利用全备+二进制日志前滚进行恢复,而binlog2sql采用针对row格式的binlog生成逆向sql执行回滚操作,显然更快速,方便。用途:

数据快速回滚(闪回) 主从切换后新master丢数据的修复 从binlog生成标准SQL,带来的衍生功能工具包路径:

mysql连接配置 -h host; -P port; -u user; -p password 解析模式 --stop-never 持续解析binlog。可选。,默认False,同步至执行命令时最新的binlog位置。 -K, --no-primary-key 对INSERT语句去除主键。可选。默认False -B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。 --back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。 解析范围控制 --start-file 起始解析文件,只需文件名,无需全路径 。必须。 --start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。 --stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。 --stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。 --start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。 --stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。 对象过滤 -d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。 -t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。 --only-dml 只解析dml,忽略ddl。可选。默认False。 --sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。使用binlog2sql前提条件:

MySQL server必须设置以下参数: [mysqld] server_id = x log_bin = /xxx/mysql-bin.log max_binlog_size = 1G binlog_format = row binlog_row_image = Fullbinlog2sql 指定user需要的最小权限集合:

select, super/replication client, replication slave模拟误删除部分数据的场景:

删除sbtest10表中id在10-100之间的数据:

查看binlog位置:

为方便排查,做了一次日志切换,可以推断出删除操作应位于mysql-bin.日志中。

利用mysqlbinlog解析binlog,找出删除操作具体位置:

找到了删除操作的位置pos:2145

使用binlog2sql根据删除操作位置可以打印出删除sql和逆向sql(闪回):

生成删除操作sql:

python2.7 binlog2sql.py -uroot -p -h192.168.56.2 -P3310 -dgobench --start-file='mysql-bin.000006' --start-position=25864658 --stop-position=25882145 > binlog2sql.sql

生成闪回sql:

python2.7 binlog2sql.py --flashback -uroot -p -h192.168.56.2 -P3310 -dgobench --start-file='mysql-bin.000006' --start-position=25864658 --stop-position=25882145 > flashback.sql

应用闪回sql回滚:

mysql -uroot -p -h192.168.56.2 -P3310 < flashback.sql

验证误删除数据是否恢复: