【 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_TIME
和 DT_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,这种一般很难处理。。。
谢谢您的解答。再请问有解决办法吗?这种情况一般是怎么导致的呢?
数据量不大 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 回写功能,没有预期写入完导致。