[FAQ] TiDB - #[kv 1062] Duplicate key#显示的写入Auto_Incrment 后,报自增主键 ID冲突

[问题澄清]

场景 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

[解决办法]

  1. 避免业务上显示的插入自增 ID
  2. 去除 Auto_incrment 属性,ID 完全由业务方插入
  3. 在数据CDC 同步完成后,重启 各各 TiDB server 已释放 自增 ID 缓存