数据库产生主键id相同的重复数据

【 TiDB 使用环境】测试
【 TiDB 版本】V6.1.1
【复现路径】单表频繁更新200万次后出现数据重复问题
【遇到的问题:问题现象及影响】
数据库单表频繁更新后,数据出现主键一致的情况,但数据的更新时间字段不一样;

表结构能看一下吗?

DROP TABLE IF EXISTS TAB_ORG;
CREATE TABLE TAB_ORG (
S_ID varchar(100) NOT NULL COMMENT ‘组织id’,
S_NAME varchar(100) NOT NULL COMMENT ‘组织名称’,
S_PARENT_ID varchar(100) NOT NULL COMMENT ‘父组织id’,
S_CODE varchar(100) DEFAULT ‘’ COMMENT ‘编号’,
I_TYPE int(11) DEFAULT NULL COMMENT ‘组织类别id’,
I_ORDER int(11) NOT NULL COMMENT ‘顺序号’,
S_PATH varchar(100) NOT NULL COMMENT ‘组织路径’,
S_ICON varchar(100) DEFAULT ‘’ COMMENT ‘图标’,
DT_CREATE_TIME datetime DEFAULT NULL COMMENT ‘创建时间’,
DT_UPDATE_TIME datetime DEFAULT NULL COMMENT ‘修改时间’,
S_CREATE_USER varchar(100) DEFAULT ‘’ COMMENT ‘创建人’,
S_UPDATE_USER varchar(100) DEFAULT ‘’ COMMENT ‘修改人’,
I_DEL_FLG int(11) NOT NULL DEFAULT 0 COMMENT ‘删除标志’,
I_LEVEL int(11) DEFAULT NULL COMMENT ‘组织层级’,
S_DESCRIPTION varchar(200) DEFAULT ‘’ COMMENT ‘描述’,
S_EXTEND_INFO longtext DEFAULT NULL COMMENT ‘扩展信息’,
S_DOMAIN_TYPE varchar(100) DEFAULT ‘’ COMMENT ‘域类型,0或者空本级,下级域’,
PRIMARY KEY (S_ID,I_DEL_FLG) /*T![clustered_index] NONCLUSTERED */,
KEY INDEX_TAB_ORG_S_PARENT_ID (S_PARENT_ID),
KEY INDEX_TAB_ORG_S_PATH (S_PATH),
KEY INDEX_TAB_ORG_I_TYPE (I_TYPE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT=‘组织架构表’
PARTITION BY HASH (I_DEL_FLG) PARTITIONS 2;

i_del_flg这列也是重复的?

也是重复的,两条数据除了 DT_CREATE_TIMEDT_UPDATE_TIME都是重复的

ADMIN CHECK table TAB_ORG;
执行下看看

执行结果报错了:

SQL 错误 [8223] [HY000]: data inconsistency in table: TAB_ORG, index: PRIMARY, handle: 4, index-values:“handle: 30001, values: [KindString 510000000000-Structure KindInt64 0]” != record-values:“handle: 4, values: [KindString 510000000000-Structure KindInt64 0]”

https://docs.pingcap.com/zh/tidb/v6.1/troubleshoot-data-inconsistency-errors#error-8223
数据索引不一致的bug,这种一般很难处理。。。

1 个赞

谢谢您的解答。再请问有解决办法吗?这种情况一般是怎么导致的呢?

数据量不大 create 新表 数据导入新表把

这就是bug了,像如果是索引不一致,还可以修索引,但是你这表里面数据都不一致了,没法处理了,除非你从业务上判断那条数据是异常的,直接给他干掉,但即使你现在干掉了,后面应该还是有可能出现同样的问题的。。。
这个要不真得找表妹联系下tidb的开发人员看看了

可以提issue了吧

https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-recover

ADMIN RECOVER INDEX 语句用于在表发生行数据和索引的一致性故障时,根据表中多余的索引,使表的行数据和索引重新恢复到一致状态。注意,该语法尚不支持[外键约束](https://docs.pingcap.com/zh/tidb/stable/foreign-key)。

试试这个。不过这个看说明用于从表恢复的索引数据。如果表中的记录重复对应到了一条唯一索引/主键,就比较难办了。不清楚delete语句能否在表上正常运行。而且如果是聚簇索引表的主键出问题,应该也没法drop掉重建。

https://docs.pingcap.com/zh/tidb/stable/sql-statement-drop-index#mysql-兼容性

这样的话,得是bug了

索引数据不一致一般是 Lightning local 模式导入没有正确退出或者用 tispark 回写功能,没有预期写入完导致。