首页 > 代码库 > binlog2sql使用总结

binlog2sql使用总结

binlog2sql是大众点评开源的一款用于解析binlog的工具,在测试环境试用了下,还不错。

 

其具有以下功能

1. 提取SQL

2. 生成回滚SQL

 

关于该工具的使用方法可参考github操作文档:https://github.com/danfengcao/binlog2sql

个人感觉该文档已相当简单明了。

 

使用该工具的前提

1. binlog_format为ROW,且binlog_row_image为full或noblog,默认为full。

2. 必须开启MySQL Server,理由有如下两点:

   1> 它是基于BINLOG_DUMP协议来获取binlog内容

   2> 需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句

 

提取SQL示例

#  python binlog2sql.py -h192.168.244.10 -P3306 -uadmin -p123456 -dtest -ttest --start-file=‘mysql-bin.000028‘

INSERT INTO `test`.`test`(`id`, `name`) VALUES (10, a); #start 4 end 284 time 2017-02-17 15:36:27
INSERT INTO `test`.`test`(`id`, `name`) VALUES (11, b); #start 4 end 376 time 2017-02-17 15:36:31
UPDATE `test`.`test` SET `id`=11, `name`=c WHERE `id`=11 AND `name`=b LIMIT 1; #start 4 end 476 time 2017-02-17 15:36:40
DELETE FROM `test`.`test` WHERE `id`=11 AND `name`=c LIMIT 1; #start 4 end 568 time 2017-02-17 15:36:48
INSERT INTO `test`.`test`(`id`, `name`) VALUES (12, d); #start 599 end 763 time 2017-02-17 15:37:09
INSERT INTO `test`.`test`(`id`, `name`) VALUES (13, c); #start 794 end 958 time 2017-02-17 15:37:15
UPDATE `test`.`test` SET `id`=13, `name`=d WHERE `id`=13 AND `name`=c LIMIT 1; #start 989 end 1161 time 2017-02-17 15:37:23
DELETE FROM `test`.`test` WHERE `id`=13 AND `name`=d LIMIT 1; #start 1192 end 1356 time 2017-02-17 15:37:30

 

生成回滚SQL示例

# python binlog2sql.py --flashback -h192.168.244.10 -P3306 -uadmin -p123456 -dtest -ttest --start-file=‘mysql-bin.000028‘

INSERT INTO `test`.`test`(`id`, `name`) VALUES (13, d); #start 1192 end 1356 time 2017-02-17 15:37:30
UPDATE `test`.`test` SET `id`=13, `name`=c WHERE `id`=13 AND `name`=d LIMIT 1; #start 989 end 1161 time 2017-02-17 15:37:23
DELETE FROM `test`.`test` WHERE `id`=13 AND `name`=c LIMIT 1; #start 794 end 958 time 2017-02-17 15:37:15
DELETE FROM `test`.`test` WHERE `id`=12 AND `name`=d LIMIT 1; #start 599 end 763 time 2017-02-17 15:37:09
INSERT INTO `test`.`test`(`id`, `name`) VALUES (11, c); #start 4 end 568 time 2017-02-17 15:36:48
UPDATE `test`.`test` SET `id`=11, `name`=b WHERE `id`=11 AND `name`=c LIMIT 1; #start 4 end 476 time 2017-02-17 15:36:40
DELETE FROM `test`.`test` WHERE `id`=11 AND `name`=b LIMIT 1; #start 4 end 376 time 2017-02-17 15:36:31
DELETE FROM `test`.`test` WHERE `id`=10 AND `name`=a LIMIT 1; #start 4 end 284 time 2017-02-17 15:36:27

 

总结

1. 看了下源代码,它本身的核心代码比较少,主要是在pymysqlreplication的基础上进行了二次开发。

    pymysqlreplication实现了MySQL复制协议,可捕捉不同类型的EVENT事件。

    具体可参考:https://github.com/noplay/python-mysql-replication

2. 个人感觉,直接解析文本格式的binlog,也未尝不是一个好办法。

    理由如下:

    1> binlog2sql强烈依赖于MySQL复制协议,如果复制协议发生改变,则该工具将不可用。

        虽然,复制协议发生改变的可能性很小(一般都会保持向前兼容),但相对而言,自带的mysqlbinlog肯定更懂binlog,基于mysqlbinlog解析后的结果进行处理,可完

        全屏蔽复制协议等底层细节。

    2> 用python来解析文本格式的binlog,本身也不是件难事。

         譬如,update语句在binlog中的对应的文本

         在得到表结构的情况下,基本上可离线解析。

### UPDATE `test`.`test`
### WHERE
###   @1=13 /* INT meta=0 nullable=0 is_null=0 */
###   @2=c /* VARSTRING(20) meta=20 nullable=1 is_null=0 */
### SET
###   @1=13 /* INT meta=0 nullable=0 is_null=0 */
###   @2=d /* VARSTRING(20) meta=20 nullable=1 is_null=0 */

 

binlog2sql使用总结