一 问题背景
生产某个记录的状态,总是被莫名其妙的被覆盖还原回之前的状态。
用户第一次反馈,以为是遗漏调整所致,故人为调整为了正确状态。
用户第二次反馈,真正开始重视,开始定位为什么状态会被还原回了旧的状态。也是手动先改回去,第二天持续跟踪果然又被还原回去了。
二 定位过程
第一步
首先排查后端服务,所有有可能更改这个字段的地方,经过一番排查,并没有发现任何可疑的地方。
第二步
开始查binlog日志,主要是针对更改后,被改回去的这段时间,只有半天,则只查这半天的binlog。
具体操作如下:1
2
3
4
5# 首先先找到这段时间的binlog日志 由于我们使用的是RDS,直接在RDS里下载对应的binlog日志即可
# 下载好之后,通过binlog的命令转成sql
/usr/bin/mysqlbinlog --base64-output=decode-rows -v mysql-bin* > binlog.log
# 再通过关键字查binlog.log定位对应的sql情况
cat binlog.log | grep -C 10 xxx
通过定位确实看到了被覆盖的执行sql,经过进一步定位,发现这个sql是大数据同步数据的时候覆盖的。
关键是这个问题,之前跟大数据沟通过并达成一致意见,大数据那边要当这几个字段不存在,而不是覆盖我们的状态数据。结果可能是大数据忘记调整了,导致了此问题。问题出现时,我一直都没考虑过是大数据同步数据造成的问题,原因是这块之前沟通过并达成了一致的意见。
三 总结
经过这次的事情,得出了两个经验教训:
第一,达成一致意见并不代表一定会执行,所以持续跟进很重要。确保能够及时执行。
第二,排查问题,不要带入主观想法,所有有可能造成的原因都不能放过,如果思维定式觉得哪块一定不会问题,而去排查其他地方,那方向可能就错了。