使用mysqlbinlog找回数据,定位问题的一次经历

mysqlbinlog问题追查

  • 事件
  • 心态
  • 讨论
  • mysqlbinlog
    • mysqlbinlog说明
    • mysqlbinlog转成sql语句
    • 使用grep提取相关sql

事件

产品经理说,分账出问题了,今天所有的分账没有进账户余额没生效。

心态

首先判断不可能,测试挺过关,线上运行挺长时间。 还是去查查数据吧, 一看所有公司主体账户余额都是0。完,心态炸了,怎么可能,没准是碰上不小的事了。

余额都是0的情况,第一感觉是谁的sql没有where条件
看账户余额表看,说账户流水表看, 一看update_time都一样,哦,。。。
后才看到update_time一样是流水表,不是账户余额表,,心态不好干啥都不行呀。 眼睛也不好使用。

讨论

没得办法了, 向相关领导和同事通后情况吧。
经讨论:

  • 检查数据
  • 代码是后有漏洞bug
  • 下载mysqlbinlog

后经检查日志和流水, 确定是所有主体都做了充值提现,所以余额都是0。
你们这是什么操作!!!,一天之内操作所有主体,财务了不起嘛,让数据看起来这么诡异!!!

财务是了不起的, 数据就是这种表现,谁说一定要像用户数据一样千资百态了~~~。

mysqlbinlog

问题是定位了,还得从侧面再定位一下,一定不是数据出了什么问题。一定不能是有异常sql执行导致, 看看binlog表现

mysqlbinlog说明

mysqlbinlog有三种模式,关于三种模式的不同有很多文章说明,只交代一下,我们用的是行模式。

看看行模式的效果:

重点是:行模式通过binlog能找回sql执行前是整行数据,和执行后整行数据

mysqlbinlog转成sql语句

关于mysqlbinlog转成sql查看:(-v, -vv ,–base64-output 参数的区别和作用)

https://blog.csdn.net/jolly10/article/details/80077366

使用mysqlbinlog工具把二进制日志改成sql文件

mysqlbinlog -vv --base64-output=decode-rows -d payapi_pdu_db mysql-bin.000718 > mysql-bin.000718_payapi_pdu_db.txt

使用grep提取相关sql

提取相关表操作的上下N行

grep -A 20 -B 1 'company_account' mysql-bin.000718_payapi_pdu_db.txt

结果如下:

-A, -B -C参数说明:

https://www.computerhope.com/unix/ugrep.htm

使用mysqlbinlog找回数据,定位问题的一次经历_第1张图片
使用:grep (GNU grep) 3.3
mac系统改成gun grep参考文章:

https://blog.csdn.net/youwen21/article/details/100514013

你可能感兴趣的:(MySQL)