tidb查询数据混乱

select * from {table} 本身就没有保证结果集稳定的语意。
不同的数据库有不同的实现方式,有的数据库因为它扫数的方式不同,处理结果集合的方式不同,有的可以天然保证有序,有的则不能。

比如:TiDB 里扫的数据在不同 Region 中,不同 Region 在不同 TiKV 中,扫的时候有时候先到 TIDB 有时候后到,这是无法保证的,应该算作是用问题。

建议如: ShawnYan 指出的那样,加 Order by 解决。

执行过了,也是没有效果

对的,没错,是非主键查询就有问题

没有可以排序的字段。。。。

https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-check-table-index#admin-check-tableindex
admin check一下那个表,看看有没有问题,我看你也找到了21年的那个帖子,那个帖子里面我看也没有最终回复,另外,楼上的两位大佬也说了一种可能性,你这个查询的时候,有没有加limit,工具有没有加limit,找一个字段,比如说item_id,查询的时候,加order by,这也是一种可能性。

加上order by item_id也是出现了两条

哦哦,不对,我给看成 本该是 2 条数据,但是要求结果集合有序 的问题了,sorry。
问题应该是,delivery_id=4025931 却出现了 2351687? admin check table 结果如何?

image


通过delivery_id查询主键重复了!

看着像数据索引不一致的问题, admin check table 结果如何?


执行一个多小时了,还没结束:sweat:

哦哦,这个慢正常:rofl:,等结果吧:thinking:

我这个是大范围的重复,不是零星的几条数据

看起来有点像数据和索引不一致的问题。
如果是的话曾经由这两个 pr 修复过
https://github.com/pingcap/tispark/pull/2156
https://github.com/pingcap/tispark/pull/2101
建议使用 tispark 2.4.3 看是否能够解决该问题

是个bug吗

现在有两个方案,一个是上面 shiyuhang0大佬说的两个pr,你看看升版本能不能解决,还有一个方案是,你提供个复现步骤,如果涉及到隐私,私信给我,我们找个环境看看能不能复现。

看下执行计划走的那个索引,强制走另外的索引试试结果对不对;

admin check table的结果:

索引数据对不上!

好的,
我这边的tispark的版本是2.4.1,tidb的版本是5.3.0
tispark写入tidb的代码是:
df.write.
format(“tidb”).
option(“tidb.addr”, “xxx”).
option(“tidb.port”, “4000”).
option(“tidb.user”, “xxx”).
option(“tidb.password”, “xxx”).
option(“database”, “bdata”).
option(“table”,tblName).
option(“replace”,true).
option(“isolationLevel”,“NONE”).
option(JDBCOptions.JDBC_BATCH_INSERT_SIZE,1000).
mode(“append”).
save()
表总的数据量是千万级别,每次执行写入的条数大约是几千条,包含大量的update的记录

我这里换成了tispark换成了2.4.3也是一样的错误
data inconsistency in table: erp_sdb_wms_delivery_items, index: ind_number_delivery, index-count:4 != record-count:3

对不上是否应该试一下小黑大佬说的 admin cleanup 命令修复一下?