必须配对设置auto_increment_increment和auto_increment_offset并写入my.cnf的[mysqld]段且重启生效:两节点时increment设为2,A节点offset=1(生成奇数ID),B节点offset=2(生成偶数ID),否则必现主键冲突。

双向主主复制不是配完 server-id 和 log_bin 就能跑通的——自增 ID 冲突是上线即崩的高频雷,必须靠 auto_increment_increment 和 auto_increment_offset 配对生效,缺一不可。
为什么只改 auto_increment_offset 会失效
只设 auto_increment_offset = 2,但没动 auto_increment_increment(仍为默认 1),结果就是:A 节点插出 1、2、3,B 节点也插出 1、2、3。offset 只管“第一个值”,increment 才决定“下一个值跳多远”。两者必须配合,否则等于没配。
- 两节点时,
auto_increment_increment必须设为 2;三节点则必须为 3,以此类推 -
auto_increment_offset每台机器只能取 1 到increment之间的整数,且不能重复(如双节点分别设 1 和 2) - 临时
SET GLOBAL修改后,MySQL 重启就丢,生产环境必须写进/etc/my.cnf的[mysqld]段并重启服务
配置必须写进 my.cnf 并重启,不能只靠 SET GLOBAL
运维常犯的错:在 MySQL 客户端里执行 SET GLOBAL auto_increment_increment = 2,以为生效了。其实这只是会话级临时覆盖,mysqld 进程一重启,参数立刻回滚到配置文件值(或默认值)。双主切主时若参数丢失,新主库继续用默认步长 +1,马上和另一台撞 ID。
- 正确做法:编辑
/etc/my.cnf或/etc/mysql/my.cnf,在[mysqld]下添加两行:auto_increment_increment = 2auto_increment_offset = 1(A 节点)auto_increment_increment = 2auto_increment_offset = 2(B 节点) - 确认配置段落正确:不能写到
[client]或[mysql]下,否则完全不加载 - MySQL 8.0+ 可用
SET PERSIST持久化,但依然建议优先走配置文件,避免版本兼容风险
验证是否真生效:别信配置文件,要看运行时值
改完配置、重启 mysqld 后,必须连上每台实例执行 SQL 验证,不能只看配置文件有没有写对。
- 执行:
SELECT @@auto_increment_increment, @@auto_increment_offset; - 检查返回值是否与预期一致(如 A 返回 2 和 1,B 返回 2 和 2)
- 同时确认
log_slave_updates = ON、binlog_format = ROW、server-id唯一且非零
最易被忽略的是:所有节点都必须开启 log_slave_updates,否则从对方同步来的变更不会写入本地 binlog,导致链路断裂;另外,DDL 操作(如 ALTER TABLE)在双向复制中极易引发不一致,务必禁止跨节点并发执行。











