MySQL主从库为什么会出现同一条数据的某个字段不一致?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从库为什么会出现同一条数据的某个字段不一致?相关的知识,希望对你有一定的参考价值。

问题描述:

开发环境的mysql用了两台节点,主从同步结构。忽然有开发同学反映说在主库insert一条数据,发现在从库没有同步,查不到这条数据。于是开始排查。

原因排查:

1、查看主从同步状态

在主库执行:

show master statusG

在从库执行:

show slave statusG;

发现从库同步的bin log的Position跟主库查询到的不一致,以为是同步延迟了。然后手动在主库创建了一个测试database,发现从库立即同步了,主从同步的点也是一致的。

2、排查插入字段

于是再次查看表数据,发现主从的这张表数据量是一样的,但是根据“id”这个字段去查,主库能找到数据,但是从库就是查不到。
然后换了个关键字“factoryId”去查询,发现主从库都有数据,但是两个库查询出来的数据id是不一致的:
技术分享图片
技术分享图片

将两条数据删掉,重新调用代码接口插入数据,结果还是一样的,两条数据的id就是不一样。然后尝试手动insert一条语句,发现不存在这个问题:
技术分享图片
技术分享图片

3、检查代码

手动insert语句和创建database,主从同步都没有问题,只有在使用代码调接口insert语句的时候会出现主从库同一条数据的id不一致的情况。于是开发同学排查了代码里面的的插入语句方式。

最后发现原因是这样的:
使用代码调接口执行insert语句,固定指定的字段只有factoryId和appTag这两个字段。
id这个字段不是在代码里面生成的,而是在数据库随机生成的。所以就导致同一条insert语句,在主库insert的时候会随机生成一个id,在从库也会生成一个随机的id,就会导致主从库上这条数据的id不一致,根据id去查询,就会发现从库无法查询到该数据。
而因为factoryId和appTag这两个字段是在insert的时候就指定好了的,所以主从是一致的,只有id不一致。因为之前很少用id这个关键字,因此该隐藏问题未被发现。

解决方法:

需要修改接口代码,更改insert语句的插入方式,问题就解决了。

后记:
之前也有开发同学也反映过一次这个问题,但是那次也刚好主从同步出现了问题。然后看到网上很多也说这种情况是主从同步的问题,于是重新把从库的数据删除完了,再把主库的全部数据导到从库解决的。这次算是找到原因了

以上是关于MySQL主从库为什么会出现同一条数据的某个字段不一致?的主要内容,如果未能解决你的问题,请参考以下文章

快速搭建 MySQL 的主从数据库

在主从服务器上,同一个表的表空间文件大小相差特别大,可能原因是什么,怎么解决?

一种粗暴快速的解决mysql主从不同步错误的思路

mysql主从状态异常解决办法

(日常疑问)同一个mysql为什么可以查询其他库的数据?

MySQL主从复制什么原因会造成不一致,如何预防及解决?