故障分析 | MySQL 主从切换后数据不一致了?
作者:王田田,DBA,擅长发呆,偶尔热爱分享。
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 1200 字,预计阅读需要 3 分钟。
1背景
近期生产上出现了个故障,某一套部署了 MySQL 主库的服务器由于硬件问题导致服务器宕机重启。由于该库部署了相关高可用组件,在服务器重启之后,该数据库服务被高可用组件拉起,并和新主库搭建了复制关系。
目前听起来没什么问题,蹊跷的是只复制了一会儿就报错了,复制中断报错信息大致是:Could not execute update_rows event on table xx; Can't find record in xx,Error_Code: 1032; handler error HA_ERR_KEY_NOT_FOUND;...
这到底是怎么回事呢?
2故障排查过程
(1)首先,第一反应是怀疑 主从切换是不是做的强制切换,导致新主上丢数据了?通过相关高可用组件的日志可以看到,切换时主从的 GTID 是一致的,即大致可认为该库在切换时未丢数据。无问题。
(2)再排查一些 slave 相关配置参数,看看是否是参数问题导致主从数据有不一致的潜在风险。无问题。
(3)接下来,在新从库执行 show slave status\G
时,发现新从库上自身比新主库多了一个 GTID。有问题。
(4)通过 mysqlbinlog -vvvv binlogs.xx --include-gtids=xx
解析这个多出的 GTID。发现该事务涉及的表和复制中断报错的表竟然是同一张表!
内容大致如下(本文中所有的表均是个人用于复现用的测试表,而非生产环境的表)。
BEGIN<br>/*!*/;<br># at 349<br>#240716 12:33:45 server id 1002 end_log_pos 509 CRC32 0xbea1877e Query thread_id=9 exec_time=0 error_code=0<br>use `sky`/*!*/;<br>SET TIMESTAMP=1721104425/*!*/;<br>DELETE FROM `sky`.`sky_test` /* generated by server, implicitly emptying in-memory table */<br>/*!*/;<br># at 509<br>#240716 12:33:45 server id 1002 end_log_pos 584 CRC32 0xd0443172 Query thread_id=9 exec_time=0 error_code=0<br>SET TIMESTAMP=1721104425/*!*/;<br>COMMIT<br>
📚 文档:https://actiontech.github.io/sqle-docs/
💻 官网:https://opensource.actionsky.com/sqle/
👥 微信群:请添加小助手加入 ActionOpenSource
🔗 商业支持:https://www.actionsky.com/sqle