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日志中。
利用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
使用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
生成闪回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
应用闪回sql回滚:
mysql -uroot -p123456 -h192.168.56.2 -P3310 < flashback.sql
验证误删除数据是否恢复: