Analysisbinlog是我在学习binlog event结构及存储的时候,为了更深入理解写的一个对binlog的分析工具,基于python2.7开发,相较于mysqlbinlog工具显示简化很多,可以分析可以对row数据生成回滚语句,对静态文件分析时可定位组合有下面几个:

Thread_id

Position范围

时间范围

GTID

Position 范围 + thread_id/gtid

时间范围 + thread_id/gtid

 

也可以使用该工具作为mysqlslave端获取及实时接收binlog日志,该工具主要是自己用来平时分析使用,所以使用的binlog file + position的方式同步,也就必须提供binlogposition位置,默认不提供直接使用当前mysqlbinlogposition

实时的持续打印mysqlbinlog日志 (--block 默认未打开)

Positon范围

Postion + gtid/thread_id

 

打印效果:

wKiom1mmkjngyqRZAACI7ipv0qc421.png

精简了对我们没多大用的数据,只显示执行语句、GTIDPOSITIONthread_id、库表名及对应行数据等记录,如一个事务修改多条记录,那么这几条变更的记录都会在GTIDXID中间显示,行数据内容顺序和字段顺序相对应

 

我们DBA在工作中有可能会遇到应用发布时出错需要回滚数据或者眼花错删数据这种奇葩情况,这工具也可以对binlog生成回滚语句,对静态文件分析打印出的sql语句相对binlog是倒叙的,再也不用怕事务顺序影响回滚了(哈哈....),生成回滚语句的方式也有几个可供选择:

静态分析:

全文件生成回滚语句(需要回滚全文件的可以直接删库跑路了)

Position范围

GTID

Position 范围 + GTID/thread_id

replication在线方式:

GTID

Thread_id

 

显示效果如图:

wKioL1mmkj6jAS9FAABbMC-K2DU176.png

生成的回滚语句上方会有对应的GTID号,可以利用它对生成的语句进行校验,对update_rows_eventinsert_rows_event数据的表结构做了判断,如果有primary key字段就使用primary key字段作为where条件,减少数据内容。

 

下载地址:https://github.com/wwwbjqcom/Analysisbinlog.git

 

使用帮助:

下载到本地后在文件夹里有个Analysisbinlog.py的文件,生成回滚及远程访问的方式需要先安装pythonpymysql模块,生成回滚语句需要获取表结构时要用到,先添加可执行权限

> chmod +x Analysisbinlog.py

> ./Analysisbinlog.py -h  #显示所有参数项,如下图

wKiom1mmkmPjV8M5AAEaWHOoSfM876.png

 

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001  #只添加文件参数将分析binlog整个文件内容

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001 --start-position 2221 --stop-position 2786   #打印某个position范围内的内容

wKioL1mmkluhVR1CAACdzjTV62g732.png

 

其余参数组合可以自己测试,如果positondatetime范围都有指定,优先position范围分析

 

由于生成回滚语句需要提取表结构,所以必须提供连接数据库的参数项

> ./Analysisbinlog.py -f /usr/local/mysql/data/localhost-bin.000001 -r --user 'root' --passwd 'root' --host 'localhost' --port 3306

-r : 打开回滚模式

后面的--user--passwd都是必须项,下图我操作的是对position范围生成回滚语句

wKioL1mmkmiQV926AABVSUvMVzc976.png

replication在线方式:

--remote : 开关

必须指定参数 --user--passwd

可选参数:

--log-file : binlog文件名称,默认当前binlog

--start-postion : 开始同步的pos位置,如指定了--log-file默认为4,如未指定--log-file默认为当前position

--stop-position:

--block: 是否持续接收masterbinlog,默认不打开,接收完master当前binlog将断开

--server-id: 默认133

在线打印只可以对GTIDthread_id进行过滤及产生回滚语句,在版本发布时先查询到thread_id再开启工具实时打印该链接线程操作的回滚语句,有先后顺序关联的推荐使用离线文件生成倒叙sql,可以降低数据出错的几率

 

该工具我没有对setbit两个字段类型做分析,因为我觉得这两个字段使用的几率很小,如果有需求的话可以联系做添加,如果自己能添加最好,可以深入的对binlog及数据存储做了解,可以参考一下我之前发的<binlog 详细解读>,还有一点我在取结构时没有取enum字段的值,所以有该字段类型的回滚语句会有问题,binlog中是存储的索引值,并不是enum设置的值,这个需注意,在使用该工具对静态文件分析时推荐使用position范围做组合,可以提升定位效率

 

ps:mysql技术交流qq群479472450,个人微信公众号会发一些平常研究整理文章,多多关注


wKioL1mmksyD31MaAACdmBNTJsw752.jpg