[问题澄清]
场景 1
业务通过 DM 或者 TiCDC 等其他 数据同步工具完成数据同步后,业务发起切换上线。
上线后有可能会报出 1062 主键冲突问题
场景 2
业务上有应用主动写入自增 id,也有应用通过 TiDB 自主分配自增 ID
[问题确认]
通过 TiDB Log 会看到如下日志报错
TiDB 自增 ID 分配规则是由统一 PD 为每一个 TiDB server 分配一段自增 ID,每个 Schema 分配一段全局不重复且是当前最大的 自增 ID 区间。
分配的时机:
- tidb server 重启后
- 发生主键冲突报错后
如果出现上面提到的 2 种典型场景。
都会因为显示的向 具有自增ID的 列,插入数据。因为 TiDB Server 是无状态的。TiDB Server 彼此之间并不会知道其他 TiDBserver 插入ID 的情况。故其他 TiDB Server 持有了以备插入 ID 的 自增 ID区间,当插入同样自增 ID 时会发生报错
举个栗子
- TiDB-Server A 持有 tableA 的 1-3000 自增 id
- Server B 持有 tableA 的 3001-6000 自增 id
- 在 Server A 显示的写入 TableA 的 ID 3002
- 在 Server B 上自动获取插入 数据 当分配到 3002 自增 ID 时 ,业务报错 [kv 1062] Duplicate key
[解决办法]
- 避免业务上显示的插入自增 ID
- 去除 Auto_incrment 属性,ID 完全由业务方插入
- 在数据CDC 同步完成后,重启 各各 TiDB server 已释放 自增 ID 缓存