拆成 8 个片之后,每个片的自增都从 1 开始,第二批数据写入时开始报 1062 Duplicate entry '1' for key 'PRIMARY',订单号也跟着重复。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

SET GLOBAL auto_increment_increment = 8;
SET GLOBAL auto_increment_offset = 3;

每个分片是独立实例,auto_increment 各自计数,片与片之间没有协调。业务又把自增 id 当成全局订单号用,冲突直接暴露到接口。这一点先确认清楚,后面就不用反复试。

碰到「分片自增主键」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,把自增步长设成片数 起始值按片号错开;更稳妥的是换成 Snowflake 或号段服务 由应用生成 id;历史数据按片号重新编号 同时更新关联表;给业务单号加独立序列 不要复用主键。

改完照着核一遍,八个片各插入一万行 主键集合无交集 插入不再报 1062。

作者 9823189