双主复制必须配对设置auto_increment_offset和auto_increment_increment,如A设increment=2、offset=1生成奇数ID,B设increment=2、offset=2生成偶数ID,且须写入my.cnf并重启生效。

auto_increment_offset 和 auto_increment_increment 必须配对设
单独改 auto_increment_offset 没用,必须和 auto_increment_increment 一起调,否则自增ID依然会撞。比如两台主库都设 offset=1 但 increment=1,还是生成 1,2,3…,一同步就报 Duplicate entry '2' for key 'PRIMARY'。
真实场景下:双主必须设 auto_increment_increment = 2,再分别设 offset = 1 和 offset = 2。这样一台只出奇数 ID(1,3,5…),另一台只出偶数 ID(2,4,6…),天然错开。
- 改完不重启 MySQL,配置不生效——这两个变量只在启动时读取一次
- 不能只靠
SET GLOBAL auto_increment_offset = 1临时设,复制线程可能还在用旧值 - 如果未来要加第三台主库,得提前把
increment改成 3,并重新分配offset为 1/2/3,否则扩容即崩
my.cnf 里怎么写才真正生效
必须写进 /etc/my.cnf 或 /etc/mysql/my.cnf 的 [mysqld] 段里,且重启 mysqld 进程。只改配置文件不重启,等于没改。
示例(主库 A):
[mysqld] auto_increment_increment = 2 auto_increment_offset = 1 log_slave_updates = ON replicate_same_server_id = OFF
主库 B 则把 offset 改成 2。注意:server-id 也必须不同,否则复制直接被忽略。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
log_slave_updates = ON是双向同步的前提,否则从库收了 binlog 也不写自己的 binlog,无法继续转发 -
replicate_same_server_id = OFF是默认值,但显式写出更稳妥,防止被其他配置覆盖 - 别漏掉
binlog_format = ROW,STATEMENT 格式在某些 UPDATE 场景下会放大冲突风险
为什么 SHOW VARIABLES 看到的值和实际插入不符
因为 auto_increment_offset 不是“起始值”,而是“序列起点”。实际生成规则是:offset + n × increment(n ≥ 0)。比如 offset=2, increment=2,生成的是 2,4,6,8…,不是从 2 开始每次+1。
更关键的是:InnoDB 在 MySQL 5.7 及之前版本中,自增值只存在内存里,重启后会扫描表找最大 ID 再计算下一个值。所以即使你设了 offset=2,但如果表里已有 ID=5 的记录,下一条可能直接跳到 6(因为 5+1=6,且 6 ≡ 2 mod 2),而不是严格按 2,4,6 走。
- MySQL 8.0 后自增值写入 redo log,重启能恢复,但逻辑不变:仍按 offset+step 规则推导
- 用
ALTER TABLE t AUTO_INCREMENT = N只影响下一次插入,不改变 offset/increment 的全局规则 - 批量 INSERT(如
INSERT INTO t VALUES (),(),())受innodb_autoinc_lock_mode影响,建议设为 0 避免错乱
查当前表的自增值和全局设置有啥区别
SHOW VARIABLES LIKE 'auto_increment%' 查的是全局配置,而 SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db' AND TABLE_NAME = 't' 查的是该表当前“准备用的下一个值”,两者可能不一致。
比如你刚删了 ID=100 的行,AUTO_INCREMENT 值可能还是 101;或者你手动 INSERT 过 ID=200,那这个值就会变成 201——它反映的是“当前最大 ID + 步长对齐后的结果”,不是配置项的简单叠加。
- 不要依赖
information_schema的值来反推 offset/increment 设置是否正确 - 验证是否生效,最可靠方式是停写、清空测试表、插入几条再查 ID 序列
- 一旦发现 ID 出现重叠(如 A 插了 3,B 也插了 3),说明配置没生效或没重启,不是“偶尔冲突”,是必然失败
配置写对、重启到位、server-id 不同、log_slave_updates 开着——这四点缺一不可。少一个,双主就只是个脆弱的幻觉。










