tidb主键id查询异常会返回多条数据!帮忙看看是不是bug?

【TiDB 使用环境】生产环境
【TiDB 版本】7.1.3
【操作系统】centos7.9
【部署方式】自建
【集群数据量】
【集群节点数】20+
【问题复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
研发反馈主键查询返回多条数据,随机出现,重新查询可能恢复正常,研发确认不存在条件字符类型问题,返回的异常结果集没有查询的id!我手动查询上百次也没复现,甚至把id='1’字符串类型也没复现!下面sql是研发提供的模板,java日志打印的就是这个?格式!
这个表数据量也就5000左右!
sql:

select

        id, optimistic, create_time, last_modify_time, merchant_no, settle_cycle, settlement_method, status, settle_target

        from
        tbl_rebate_settle_info
        where
        id = ?[2426235565659127819]

返回结果:

id=2426235565659127819,entityList=[
{"createTime":"2025-04-09 06:59:43","lastModifyTime":"2025-04-09 06:59:43","id":2587638478392262841,"merchantNo":"10090789729"},
{"createTime":"2025-04-09 06:59:48","lastModifyTime":"2025-04-09 06:59:48","id":2587638564291870804,"merchantNo":"10091025725"},
{"createTime":"2025-04-09 06:59:50","lastModifyTime":"2025-04-09 06:59:50","id":2587638598652133522,"merchantNo":"10091040477"},
{"createTime":"2025-04-09 06:59:50","lastModifyTime":"2025-04-09 06:59:50","id":2587638598653706425,"merchantNo":"10091041645"},
{"createTime":"2025-04-09 06:59:54","lastModifyTime":"2025-04-09 06:59:54","id":2587638667371872287,"merchantNo":"10091043004"},
{"createTime":"2025-04-09 06:59:55","lastModifyTime":"2025-04-09 06:59:55","id":2587638684551217216,"merchantNo":"10091045244"},
{"createTime":"2025-04-09 06:59:55","lastModifyTime":"2025-04-09 06:59:55","id":2587638684551479411,"merchantNo":"10091045344"},
{"createTime":"2025-04-09 06:59:55","lastModifyTime":"2025-04-09 06:59:55","id":2587638684551741457,"merchantNo":"10091045293"}
]

查询计划:

|id|estRows|task|access object|operator info|
|---|---|---|---|---|
|Point_Get_1|1.00|root|table:tbl_rebate_settle_info|handle:2426235565659127819|

表结构:

CREATE TABLE `tbl_rebate_settle_info` (
  `id` bigint(20) NOT NULL,
  `optimistic` smallint(6) NOT NULL,
  `create_time` datetime(6) NOT NULL,
  `last_modify_time` datetime(6) NOT NULL,
  `merchant_no` varchar(32) NOT NULL,
  `settle_cycle` varchar(32) NOT NULL,
  `status` varchar(32) NOT NULL,
  `settlement_method` varchar(32) DEFAULT 'AUTO',
  `fund_handle_strategy` varchar(32) DEFAULT NULL,
  `settle_target` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
  UNIQUE KEY `idx_rsi_mn` (`merchant_no`),
  KEY `idx_rsi_ct` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

其他信息:


返回列表里没有查询的id?

没有,也是奇怪了!

做过备份还原?之前遇到过一次是,对已用的数据库做还原,还原之后出现过这种情况。

1 个赞

查询出来的数据:“id”:2587638564291870804、id”:2587638598653706425、“id”:2587638684551217216,id”:2587638684551741457
和查询条件id=2426235565659127819 完全没有关系,这个查询的执行计划是什么呢

:thinking:还有一种方式开启general_log拿一下真是sql,不排除是程序问题,没有传对值或者传值有截断。或者程序和手工查的不是一个库 :joy:

id=2426235565659127819 查询的id,和返回的id完全没有关系?这也太奇怪了吧?能手工复现嘛?如果可以手工复现,可以沿这个思路排查下。

image
问号是什么意思?手动正常查询也带问号吗?

这个是研发提供的,java变量日志打印出的sql!

我甚至手动用字符串类型查询了上百次都没复现,主键实际是int类型的!

使用 admin check table 看下表是否有损坏吧

1 个赞

我也遇到了这个情况,这张表user_id是唯一键。
如果单独查询这个字段,不会重复; 但是如果查询多个字段就会重复

没有,老业务了!

查询计划:

id estRows task access object operator info
Point_Get_1 1.00 root table:tbl_rebate_settle_info handle:2426235565659127819
没啥异常!

您后面解决了吗,我这个是等值点查,你这个like数据库实际多少条数据?

这个命令没用过:
这是桌面工具执行命令的返回:
1 queries executed, 1 success, 0 errors, 0 warnings

查询:admin check table tbl_rebate_settle_info

共 0 行受到影响

执行耗时 : 0.267 sec
传送时间 : 0.007 sec
总耗时 : 0.275 sec
这个看着是有问题不?

没解决。我试过把全表导出成文件,的确发现是存了两条主键数据

这种情况可以考虑通过_tidb_rowid删除重复数据进行修复

他这个是主键,不会有重复的数据;
现在的现象是使用主键查询出来的数据,不是对应主键的数据值

现象是的确主键重复了