本文为您介绍添加自增主键导致主备实例查询数据不一致的可能原因和解决方案。
问题现象
分别在主实例和备实例上使用同样的自增主键值(自增 ID)进行查询,查询结果中的数据不一致。
可能原因
当为无主键表添加自增主键时,自增主键值会按照数据在表中的物理存储顺序进行分配。由于无主键表缺乏显式的主键约束,其行数据的顺序由存储引擎内部的 RowID 决定,而主实例和备实例上相同数据的 RowID 可能不同,导致数据在主实例和备实例中的物理排列顺序不一致,从而使相同数据在不同实例上被分配的自增主键值不同。因此,当使用相同的自增主键值分别查询主实例和备实例时,得到的结果可能出现差异。详见 BUG#92949 和 MySQL 官方文档。
解决方案
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;