记录一次bug解决依赖mysql binlog 解析

1,同事负责的项目,出现一笔提现金额和明细统计对不上的情况,同事完全是懵的,不知道怎么查

2,我也不知道具体问题,因为我没负责这个项目,代码不是我写的,再说这种问题检查代码太难了,一般都从sql日志着手

3,但是这个项目没开启RDS的sql洞察

4,只能自己解析binlog了

5,找到提现的时间点,下载对应的binlog,希望bug是在出现问题的时间点附近

6,本地用下面的代码,把binlog转成可读的sql

mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000088 --result-file=mysq000088.txt

7,解析出来的sql文件600多M,再用文本切割成小段

8,找到会员相关sql,发现有很多地方,会员的余额钱加了,也有明细的插入sql,但是明细表里确没有数据,要么是被删了,要么是回滚了,查到这里就不是我的事儿了,让同事自己去检查吧

9,对于排查问题来说,mysqlbinlog的解析足够了,但是这个解析出来的不是直接的sql,所以不够直观,要直接看出来是啥sql,还要借助别的工具binlog2sql

10,这是Python写的,所以需要本地先安装python环境

11,安装完了后,用这个命令解析

python binlog2sql.py -h 127.0.0.1 -u root -p root  -d 数据库名 --start-file mysql-bin.001070 > 结果.txt

这里有个问题,最开始,日志文件我用的是绝对路径,但是python代码报错,说找不到文件,去看python源码看是什么问题(我不会py,大家也不要觉得没学过就肯定不会,写可能不行,看应该都没啥问题的),发现代码里比较了要解析的日志文件是否存在于logos中,这就说明了2个问题,1)日志文件不需要用绝对路径;2)日志文件要本身就是你当前mysql的,如果你是从服务器下载的日志,那么就需要把要解析的日志,改名成你本地的覆盖。

然后还需要你本地根据服务器端一样,创建库和表。这点很重要,因为binsql里是没有字段信息的,那么解析出来的sql从哪来的,只能是获取下你当前的数据库的表信息

如果binlog是GTID模式,但是本地测试环境不是GTID模式,就会报如下错误:

[root@testdb1 mysql]# python /root/binlog2sql-master/binlog2sql/binlog2sql.py -h 192.168.119.130 -uroot -pchengce243 --start-file testdb1-bin.000001 > /tmp/binlog2sql-000144.log
Traceback (most recent call last):
File "/root/binlog2sql-master/binlog2sql/binlog2sql.py", line 150, in <module>
binlog2sql.process_binlog()
File "/root/binlog2sql-master/binlog2sql/binlog2sql.py", line 74, in process_binlog
for binlog_event in stream:
File "build/bdist.linux-x86_64/egg/pymysqlreplication/binlogstream.py", line 430, in fetchone
File "build/bdist.linux-x86_64/egg/pymysql/connections.py", line 684, in _read_packet
File "build/bdist.linux-x86_64/egg/pymysql/protocol.py", line 220, in check_error
File "build/bdist.linux-x86_64/egg/pymysql/err.py", line 109, in raise_mysql_exception
pymysql.err.InternalError: (1236, u"Cannot replicate GTID-transaction when @@GLOBAL.GTID_MODE = OFF, at file ./testdb1-bin.000001, position 234.; the first event 'testdb1-bin.000001' at 4, the last event read from './testdb1-bin.000001' at 299, the last byte read from './testdb1-bin.000001' at 299.")
[root@testdb1 mysql]# python /root/binlog2sql-master/binlog2sql/binlog2sql.py -h 192.168.119.130 -uroot -pchengce243 --start-file testdb1-bin.000001 > /tmp/binlog2sql-000144.log


解决办法:
set @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;


解析完之后,记得把GTID_MOD 关掉
set @@GLOBAL.GTID_MODE = OFF;

然后就能顺利解析出sql了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值