tidb 自增id 冲突

【 TiDB 使用环境】生产环境
【 TiDB 版本】tidb-vv.5.4.3
【复现路径】业务正常的insert
【遇到的问题:
业务insert 数据报错主键冲突,重启tidb-server 会缓解,过一段时间又会出现这个主键冲突

表结构信息:
由于数据需要通过c’d’c 同步到下游hive ,使用auto_random 容易导致hive 中字段溢出的问题 ,因此使用自增ID

MySQL [dcflow]> show create table tblSeaSearch\G
*************************** 1. row ***************************
       Table: tblSeaSearch
Create Table: CREATE TABLE `tblSeaSearch` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `eid` varchar(32) DEFAULT NULL,
  `flowid` bigint(20) DEFAULT NULL,
  `dataid` bigint(20) DEFAULT NULL,
  `content` mediumtext DEFAULT NULL,
  `nshead` varchar(128) DEFAULT NULL,
  `alvl` int(11) DEFAULT '0',
  `alen` int(11) DEFAULT '0',
  `deleted` int(10) NOT NULL DEFAULT '0',
  `ctime` int(10) NOT NULL DEFAULT '0',
  `utime` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  KEY `ctime` (`ctime`),
  KEY `eid` (`eid`),
  KEY `utime` (`utime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=41110159

tidb 日志信息

[2022/11/15 14:48:07.749 +08:00] [INFO] [conn.go:1121] ["command dispatched failed"] [conn=1245901] [connInfo="id:1245901, addr:10.32.11.109:35788 status:10, collation:utf8mb4_general_ci, user:dcflow_app"] [command=Execute] [status="inTxn:0, autocommit:1"] [sql="INSERT INTO `tblSeaSearch` (`flowid`,`dataid`) VALUES (?,?) [arguments: (0, 30001)]"] [txn_mode=PESSIMISTIC] [err="INSERT INTO `tblSeaSearch` (`flowid`,`dataid`) VALUES (?,?) [arguments: (0, 30001)]: [kv:1062]Duplicate entry '40376465' for key 'PRIMARY'"]

监控信息

tidb 自增主键在多个server 下可能会有问题,既然你都是自增主键了,建议将表改为AUTO_RANDOM
,还能环节热点写的问题

业务好多都用自增id, 因为auto_ramdom 会导致hive 放不下 :grinning: 其他业务都没遇到过这个问题。
你说的可能有问题是自增id cache 的bug 么还是啥?

问题已定位:业务代码bug
通过打开tidb general_log , 查看相关表的操作日志。发现update 的时候,将id 更新成了别的id 。导致后续insert 的sql 主键冲突 。
登录指定节点的tidb-server, 执行 set tidb_general_log = on;
从tidb.log 中搜索GENERAL_LOG 字样发现如下信息

1 个赞

general_log 可以👍

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。