出现主键冲突报错但冲突的主键上没有数据存在

【TiDB 使用环境】生产环境
【TiDB 版本】v8.5.0
【操作系统】AlamLinux8
【部署方式】机器部署
【遇到的问题:问题现象及影响】
问题背景
现在正在进行集群的迁移,从A集群迁移到B集群,采用的方案是选择时间节点t,从A集群dumpling t之前的数据,然后再挂上A->B的CDC同步任务,同步从t开始的数据

现在CDC任务还是开启状态,同时B上也有写入

问题描述
上述操作完成后现在B集群出现了一个很奇怪的问题 - B集群上的一个表log出现了[kv:1062]Duplicate entry 的主键冲突报错,但是查询了对应表后发现冲突的主键上根本就没有数据
log的表结构如下

CREATE TABLE `log` (
  `id` int NOT NULL AUTO_INCREMENT,
  `time` timestamp NULL DEFAULT NULL,
  `job_type` varchar(128) DEFAULT NULL,
  `job_name` varchar(512) DEFAULT NULL,
  `msg` longtext DEFAULT NULL,
  `suggestion` text DEFAULT NULL,
  `err` varchar(512) DEFAULT NULL,
  `hostip` varchar(128) DEFAULT NULL,
  `cluster` varchar(128) DEFAULT NULL,
  `namespace` varchar(128) DEFAULT NULL,
  `instance_name` varchar(128) DEFAULT NULL,
  `hostname` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  KEY `ins_name` (`instance_name`),
  KEY `job_name_IDX` (`job_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=8370002;

而且有一些很奇特的日志,例如下面这一条在调整系统变量的时候都出现了主键冲突报错

[conn.go:1184] ["command dispatched failed"] [conn=3696056984] [session_alias=] [connInfo="id:3696056984, addr:10.254.165.252:56684 status:10, collation:utf8mb4_general_ci, user:root"] [command=Query] [status="inTxn:0, autocommit:1"] [sql=COMMIT] [txn_mode=OPTIMISTIC] [timestamp=459782349450117181] [err="previous statement: SET @@SESSION.`tidb_cdc_write_source`=1: [kv:1062]Duplicate entry '8283808' for key 't_udp_troubleshoot_root_log.PRIMARY'"]

然后所有的报错都来源于同一个TiDB节点,我查询了log表的id分布,其中出现了一个极大的空缺,而且所有的主键冲突的id都在这个空缺里

select id from log where id > 8259000 order by id asc limit 100;
...
8259029
8259030
8287413
8287414
8287415
...

按照类似的问题的一些方法我查询了一些相关变量,看不出什么问题

show table log next_row_id;
DB_NAME|TABLE_NAME                 |COLUMN_NAME|NEXT_GLOBAL_ROW_ID|ID_TYPE       |
-------+---------------------------+-----------+------------------+--------------+
u      |                        log|id         |           8370002|_TIDB_ROWID   |
u      |                        log|id         |                 1|AUTO_INCREMENT|

目前的猜测
我个人的感觉是CDC上出现了一些问题导致TiDB节点上的一个范围全部失效了,因为我发现冲突的ID在A集群上的对应表里是存在的,但奇怪的是CDC运行正常,而这个表里却没有相应的数据,但我现在暂时没有进一步排查的线索和方向了

ticdc对主键冲突应该都做了自动处理方案
insert和update
https://docs.pingcap.com/zh/tidb/stable/ticdc-sink-to-mysql/ safe-mode

delete 貌似直接忽略了

b服务器最好别写数据

ticdc 同步带有自增 id 的表是通过显示写入自增 id 的方式实现,所以会执行 ticdc sql 的 tidb-server 的本地 自增 id cache 会被刷新,但是那些没有执行 ticdc sql 的实例就有可能没有刷新 cache ,就存在拿到已写入 id 的可能。

至于你说的冲突的 ID,表里没有对应数据的确比较奇怪。

但是你这种显示写入ID(ticdc)+ 业务自动分配 ID 肯定是有问题的。