暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL binlog 分析及回滚神器

小菜鸟DBA 2021-04-13
1139
binlog在mysql中既用于数据同步也用于数据一致性,而dba们平时也会有对binlog进行分析的需求,比如主从延迟了,需要看看是不是有大事物产生,还需要不定时备份下binlog文件,以防不时之需,最重要的是mysql误操作可以从binlog进行数据提取执行回滚操作,以前我有用python写了个可以执行回滚与分析的工具,这次说的是用rust重构后的新工具binlogAL,支持功能:
  • 可提取为sql语句

  • 可统计每个event大小

  • 可分析binlog数据

  • 可生成回滚数据

  • 可直接接收mysql replication协议数据进行分析

  • 可根据时间、position范围进行提取

  • 可过滤某个thread_id产生的数据、也可以过滤某个gtid的数据

  • 可过滤表产生的数据


平时可能会用到的功能基本都包括,但是有个必要的前提,binlog必须为row格式。下面进入测试环节


首先找个测试机创建库和表,这里我先随便插入了一条数据。


文件读取模式(--runtype=file):

这里我直接执行从文件读取进行分析,从结果中可以看到我刚才执行的操作,也可以提取为sql语句,只需要加一个--getsql参数

这样会直接打印出去可以执行的事物语句,一个event多条row语句会在一个事物中进行执行,能保证执行的一致性,都不用再去处理.....


再试试生成回滚数据,把--getsql参数替换为--rollback

rollback操作是先生成binlog格式的回滚文件,要提取sql或者直接用mysqlbinlog执行回滚都需要从生成的文件中进行操作,我这里直接执行的提取sql,看到已经变成了delete操作,如果用mysqlbinlog执行需要执行语句

mysqlbinlog rollback-1.log --skip-gtids | bin/mysql -utest -ptest -h 127.0.0.1

现在再来测试下各种过滤操作,首先再插入一条数据,这样和刚才的数据有时间差和线程区别。


过滤thread_id:

过滤datetime范围:

过滤postion范围:

同样也可以进行gtid、库表过滤,还有这些过滤类型的组合,比如position范围和thread_id进行组合过滤,这里就不一一进行演示,可以自己去发现,所有参数都可以通过--help获取。


replication模式获取(--runtype=repl):

只支持对thread_id、库表信息进行过滤提取, 可以使用gtid、binlog+position的方式进行注册连接,操作方式和文件方式一致,这里就不演示了


需要注意的有几点:

  • 解析数据和sql都使用到了当前连接的mysql表结构,如果结果发生了变化会报错

  • 生成的回滚数据文件已1G为大小做了拆分,如果回滚数据很大产生了多个文件,在执行时需要从后面生成的文件往前执行, 单个文件的顺序已经为倒叙

  • 如果是时间范围过滤,提供的时间必须为时间戳格式

  • 过滤gtid时,提供的gtid格式必须为binlog内的,也就是uuid:number这种,不能是执行show语句出来的uuid:1-number


下载地址见github(https://github.com/wwwbjqcom/binlogAL), 可以直接下载源码进行编译,也可以直接下载最新release下面的可执行文件, 可执行文件仅支持linux,如果需要其他平台的需要自行编译,相信参数及使用参考可见github readme文档,如有什么问题可以私信我。或者加qq群(479472450)




最后修改时间:2021-04-14 09:13:16
文章转载自小菜鸟DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论