tidb lightning导入后,业务写入报主键冲突?是bug吗?

【 TiDB 使用环境】线上
【 TiDB 版本】v5.2.3
【问题现象及影响】
tidb v4.0.0使用dumpling导出数据,然后使用lightning导入到tidbv5.2.3之后,业务偶尔会报主键冲突,业务sql没有指定主键id。重启tidb-server之后业务就无主键重启的现象出现了

报错日志:
[2022/08/10 09:35:17.654 +08:00] [INFO] [conn.go:1007] [“command dispatched failed”] [conn=9368065] [connInfo=“id:9368065, addr:10.10.10.10:33656 status:10, collation:utf8_general_ci, user:xxxxxx_wr”] [command=Query] [status=“inTxn:0, autocommit:1”] [sql=“INSERT INTO axxxxy ( x,y,z,… ) VALUES ( ‘2022-08-10 09:35:17.678’,‘2022-08-10 09:35:17.678’,0,… )”] [txn_mode=PESSIMISTIC] [err="[kv:1062]Duplicate entry ‘2432514’ for key ‘PRIMARY’"]

如果业务没有重试机制的话,导入后最好先重启下tidb节点,可以参考下这篇专栏

跟专栏里的描述不太一样,业务并没有指定主键的插入,而且是从tidb4.0.0导出然后导入到tidb5.2.3,业务流量是直接从4.0.0切到5.2.3的,而且切到5.2.3之后好几天,业务仍然有主键冲突的情况发生

主键用的是什么呢

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键’,

可以 admin check table 检查下问题数据表,检查数据索引是否一致,可能是导入时因某种原因导致了数据索引不一致造成的 Duplicate entry

我觉得这个是正常现象,自增id的tidb是分别计数的,为每个tidb分给一个自增区间段,下面来解释下这个问题,假如有192.1(a),192.2(b),192.3©三台tidb,
a目前的自增值- 101
b目前的自增值- 3001
c目前的自增值- 6001
而我们之前的数据是从mysql迁移同步过来的,相当于指定了id值的插入,假如现在插入一条6002(相当于lighting导入了一条6002),如果这个语句是在c执行的,那么c的下一个自增是6003,这没问题,但是如果这条插入是在b执行的,那么c的下一条还是6002,而这时候使用不指定自增主键的插入在c上执行就会引起主键冲突

如果是用 dumpling 从 TiDB 导出的话,导出的数据本身就是带有自增列,也就是说,lightning 不会用为新导入的表重新分配自增 ID,新表的自增 ID 和旧表应该是一样的。感觉因为导入出错的概率比较小:thinking:

可以查看下当前最大的id号,然后设置下 auto_increment_offset自增值字段的初始值;

所有的自增主键都要跳增一下,使其大于迁移前自增健的最大值