添加自增主键导致主从节点查询数据不一致

问题现象

分别在主从节点上使用同样的自增主键值(自增ID)进行查询,查询结果中的数据不一致。

可能原因

当为无主键表添加自增主键时,自增主键的值是按照数据在表中的排列顺序赋值的。在没有主键的情况下,数据在表中的顺序是由存储引擎内部的RowID决定的,同样的数据在主从节点上的RowID可能不同,因此无主键表中的数据在主从节点中的排列顺序不同,从而导致同样的数据对应的自增主键值不同,即用相同的自增主键值分别在主从节点上查询出的数据不同。详情请参见BUG#92949MySQL官方文档

解决方案

您可以执行如下步骤,解决主从节点查询数据不一致的问题:

  1. 在主节点创建一个与原无主键表相同的新表,并添加自增主键。

  2. 将数据按全部字段排序后插入到新表中。

  3. 删除原无主键表,将新表重命名为原无主键表名。

代码示例如下:

CREATE TABLE t2 LIKE t1;
ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
DROP TABLE t1;
RENAME TABLE t2 TO t1;