mysql主库加字段_Insert姿势不对,导致MySQL主从库上同一条数据的某个字段不一致...

某开发环境中,MySQL主从同步出现问题,导致数据不一致。经排查,发现是由于代码在插入数据时,未指定id字段,导致主库和从库各自生成了不同的id。解决方法是修改代码,确保从库插入时使用主库生成的id,避免主从库id冲突。
摘要由CSDN通过智能技术生成

问题描述:

开发环境的MySQL用了两台节点,主从同步结构。忽然有开发同学反映说MySQL的主从不同步了。他在测试代码功能的时候,调用接口在主库insert了一条数据,然后发现在从库上查不到这条数据。于是开始排查。

原因排查:

1、查看主从同步状态

在主库执行:

show master status\G

在从库执行:

show slave status\G;

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

2、根据数据字段排查

于是再次查看表数据,发现主从的这张表数据量是一样的,但是根据“id”这个字段去查,主库能找到数据,但是从库就是查不到。

然后换了个关键字“factoryId”去查询,发现主从库都有数据,但是两个库查询出来的数据id是不一致的:

0415476775f1aa0c9927f352ddf6b130.png

061f9446705fa31994c6cd0462aa4892.png

将两条数据删掉,重新调用代码接口插入数据,结果还是一样的,两条数据的id就是不一样。

然后尝试手动insert一条语句,发现不存在这个问题:

ded8a9d2d69f51254778b8777f520e27.png

a0029724f5b6ae8f93cd2b2fd42f7ac8.png

3、排查insert语句代码

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

最后发现原因是这样的:

这张表的数据包含id、factoryId和appTag三个字段。

当使用代码调接口执行insert语句时,代码并没有生成id这个字段固定的id号,只有生成了factoryId和appTag这两个字段的内容。所以写入数据的时候,只有factoryId和appTag这两个字段的内容的固定的,id号是在数据库里面自己随机生成的。而且在主库生成了id号之后,并没有让从库将主库生成的id直接inert到从库,而是在从库也随机生成一个自己的id。

所以就导致这样一种情况:同一条insert插入的数据,在主库insert的时候会随机生成一个id;在从库也会随机生成一个自己的id。当两个库都随机生成自己的id的时候,就会很高概率导致主从库上这条数据的id字段不一致,只有factoryId和appTag这两个字段是一致的。

因此,当根据id去查询数据,就会发现从库可能无法查询到该数据。因为之前很少用id这个关键字去进行数据库操作,因此该隐藏问题未被发现。

解决方法:

需要开发修改接口代码,修改insert语句的插入方式,将主库随机生成的id直接insert到从库,从库不再单独生成id。问题就解决了。

补充:

数据库随机生成id的两种方式:

1、随机生成uuid(uuid是根据时间戳来生成的)

2、auto_increment属性生成id

后记:

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

这次算是找到原因了,原来是insert姿势问题引起的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值