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

问题描述:

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

原因排查:

1、查看主从同步状态

在主库执行:

show master status\G

在从库执行:

show slave status\G;

发现从库同步的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语句的插入方式,问题就解决了。

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

原文地址:http://blog.51cto.com/10950710/2307368

时间: 2024-08-28 23:41:42

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

Mysql主从库同步错误:1062 Error 'Duplicate entry '1438019'

mysql主从库同步错误:1062 Error 'Duplicate entry '1438019' for key 'PRIMARY'' on query mysql主从库在同步时会发生1062 Last_SQL_Error: Error ‘Duplicate entry ‘的问题: 显然这个问题是因为插入重复主键导致从库不工作了,错误消息如下 mysql> show slave status\G; *************************** 1. row ************

mysql主从库配置读写分离以及备份

1,什么是读写分离?其实就是将数据库分为了主从库,一个主库用于写数据,多个从库完成读数据的操作,主从库之间通过某种机制进行数据的同步,是一种常见的数据库架构.一个组从同步集群,通常被称为是一个“分组”. 2,数据库分组架构解决什么问题? 大多数互联网业务,往往读多写少,这时候,数据库的读会首先称为数据库的瓶颈,这时,如果我们希望能够线性的提升数据库的读性能,消除读写锁冲突从而提升数据库的写性能,那么就可以使用“分组架构”(读写分离架构).用一句话概括,读写分离是用来解决数据库的读性能瓶颈的. 3

mysql 主从库配置

MySQL从库上有一个IO线程负责从主库取binlog到写到本地.另外有一个SQL线程负责执行这些本地日志,实现命令重放: 一.环境 主机: master操作系统:centos 5.3 IP:192.168.1.222 MySQL版本:5.0.77 从机: slave操作系统:centos 5.3 IP:192.168.1.220 MySQL版本:5.0.77 二.创建数据库 分别登录master机和slave机的mysql:mysql –u root –p 创建数据库:create datab

mysql 主从库同步

#主库修改my.ini [mysqld] server-id=2 log-bin=mysql-bin binlog-do-db=demo #从库修改my.ini [mysqld] server-id=3 replicate-do-db=demo --配置完成后重启主从库 #主库为从库添加用户 grant replication slave,reload,super on *.* to slave@14.23.88.110 identified by '123456'; show master s

mysql主从库

http://wangwei007.blog.51cto.com/68019/965575 一.mysql主从的原理 1.Replication 线程 Mysql的 Replication 是一个异步的复制过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们称之 Slave).在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql

mysql主从库配置ps:mysql5.6

1 Mysql cluster版本主从服务器搭建实践 主从的作用:MySQL的主从服务器可以满足同步数据库,同步表,同步表内容,也可以指定仅同步某个数据库或某个表,还可以排除不同步某个数据库某个表. 同步原理:主从数据库同步主要是通过二进制日志来实现同步的. 从mysql官网下载最新版本:dev.mysql.com 本文环境: 主mysql服务器:10.1.68.110 安装版本:mysql-cluster-gpl-7.0.35-linux-x86_64-glibc23.tar.gz 从mysq

mysql每几个小时导入几条数据到线上

1 由于公司需要,需要将线下的数据库每几个小时导几条数据到线上数据库中 2 3 [[email protected] bbs]# rpm -qa | grep "expect" 4 expect-5.44.1.15-5.el6_4.x86_64 5 如果没有 yum -y install expect 6 7 1,ssh映射 8 ssh_bbs.sh 9 #!/usr/bin/expect 10 set timeout 20 11 spawn ssh -C -f -N -g -i id

mysql主从同步双yes但是有些表数据不同步

web页面数据没有更新,刚开始老夫以为同步断了,上了服务器查看数据库同步状态(show slave status\G),发现是双yes,以为是数据太多堵塞没同步过来呢,待会应该就会好了,第二天看了一眼还是没有同步,查看同步状态还是双yes,同步的位置(pos)和主库是一样的,主库有数据从库没有,然后找错误日志,没有异常输出,主库从库都是这样,没有异常,查看binlog也是有的,后来在从库手动插入1条id是99999数据,提示id99999主键重复,查看了一下,id主键是99999没有数据,应该可

mysql主从库搭建

1.主备库的搭建: 略 主库:10.1.1.17 备库:10.1.1.18 2.主库授权: 允许复制备份的权限 GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'10.1.1.18' IDENTIFIED BY 'hsdhsT56'; FLUSH PRIVILEGES 3.主库数据导出 mysqldump  -uroot -p  -h 127.0.0.1 --databases TestDB --default-character-set=utf8 -