背景
看到一篇“千万不要直接给表添加自增主键啊”的公众号,添加主键后导致主从不一致,对照进行复现测试。
测试情况
版本:percona 5.7、8.0
主库开两个会话:T1,T2
T1先开启一个事物,并插入数据,等待T2提交
T2后开启一个事物,并插入数据,先提交后,T1再提交
两个事物提交后,发现主库的查询与从库的查询结果不一致,其实这种已经出现查询不一致的情况了,仅是表现为顺序不一致
主库对该表增加主键自增ID,由于主键id是按照顺序依次添加,因此加完后进一步体现出主从的数据不一致情况。
如何解决
官方文档对此给出意见:
理解一下,大致意思就是对与无主键表的情况,本身就会发生顺序不同的情况,此时添加自增字段后,需要使用临时表的方式进行,临时表插入数据时需要排序,因此并不能称为bug;同时也可以遵循不要创建无主键表的规范进行规避该问题。
影响:
1、添加完自增主键后,由于复制同步会依赖主键进行全字段更新,因此后续更新等操作会逐步修复主从不一致的情况,但此期间,从库查询的数据均为异常,所以以此方式添加主键后最好使用原主库备份后重建从库。
2、同时添加自增主键时,不是online的,则推荐锁表后,使用临时表的方式进行添加。
参考链接: 1、https://dev.mysql.com/doc/refman/8.0/en/replication-features-auto-increment.html 2、https://mp.weixin.qq.com/s/H8whVBjuuJ7PF3MLDeNE-A