MySQL闪回工具-binlog2sql

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

用途:

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

工具包路径:

https://github.com/danfengcao/binlog2sql

binlog2sql用法:

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 = Full

binlog2sql 指定user需要的最小权限集合:

select, super/replication client, replication slave

模拟误删除部分数据的场景:

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

查看binlog位置:

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

MySQL闪回工具介绍_java

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

--base64-output=DECODE-ROWS:解码方式,会显示出row模式带来的sql变更
-v 显示每个字段插入的值

mysqlbinlog  --base64-output=DECODE-ROWS -v mysql-bin.000006 > binlog_6.log

查看解析出的binlog日志:

找到了删除操作的位置pos:25864658-25882145

MySQL闪回工具介绍_java_02

MySQL闪回工具介绍_java_03

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

生成删除操作sql:

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

MySQL闪回工具介绍_java_04

生成闪回sql:

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

MySQL闪回工具介绍_java_05

应用闪回sql回滚:

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


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


MySQL闪回工具介绍_java_06