where条件查询出来的结果,跟条件值不一致

Bug 反馈
tidb版本:4.0.11
where条件查询出来的结果,跟条件值不一致
【 Bug 的影响】
业务SQL条件查询的结果与预期严重不符

【可能的问题复现步骤】

BR备份工具版本:4.0.11

1。BR全量备份(源tidb版本:4.0.5)
2。BR恢复至目标集群(目标tidb版本:4.0.11)
3。数据一致性检验正常,迁移成功。

4。BR备份源单表(表名:xxxxxx)
5。BR恢复单表至目标实例(表名:xxxxxx)
6。按条件查询,结果不符合预期

源集群+目标集群:字符集,排序规则都一致。

【看到的非预期行为】
mysql> select pid,goods_id from xxxxxx where goods_id = ‘1330377950148’ and pid = ‘100000559348’;
±-------------±--------------+
| pid | goods_id |
±-------------±--------------+
| 100000570587 | 1331151860187 |
±-------------±--------------+
1 row in set

【期望看到的行为】
select pid,goods_id from xxxxxx where goods_id = ‘1330377950148’ and pid = ‘100000559348’
期望结果
±-------------±--------------+
| pid | goods_id |
±-------------±--------------+
| 100000559348 | 1330377950148 |
±-------------±--------------+
1 row in set

【相关组件及具体版本】
BR备份工具版本:4.0.11
源tidb版本:4.0.5
目标tidb版本:4.0.11

【其他背景信息或者截图】
三机房集群
1区:3tidb+2pd+5kv
2区:3tidb+2pd+5kv
3区:1kv+1pd

xxxxxx 表行数:2000W+
ANALYZE TABLE 后多次查询仍不符合预期;

mysql> show create table xxxxxx;
±----------------------------±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
±----------------------------±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| xxxxxx | CREATE TABLE xxxxxx (
pid varchar(100) NOT NULL,
goods_id varchar(100) NOT NULL,
title varchar(200) DEFAULT NULL,
image_url mediumtext DEFAULT NULL,
updatetime varchar(50) DEFAULT NULL,
PRIMARY KEY (pid,goods_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |
±----------------------------±---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set

1 个赞

如果是还原后出现的这个情况,可以考虑尝试重建索引

关注ing

不走主键索引查询结果是正常的吗
select * from xxxxxx ignore index(PRIMARY) where goods_id = ‘1330377950148’ and pid = ‘100000559348’;

ignore index(PRIMARY)
不走主键结果也是不正常

mysql> select goods_id,pid from xxxxxx ignore index(PRIMARY) where goods_id = ‘1330377950148’ and pid = ‘100000559348’;
±--------------±-------------+
| goods_id | pid |
±--------------±-------------+
| 1331151860187 | 100000570587 |
±--------------±-------------+
1 row in set

mysql>

版本问题么?

复现步骤 1~6 描述的意思是不是这样

1~3 将上游全量数据(包含上面单表的数据)恢复到目标集群,此时上面 SQL 查询结果正常;但是 4~6 将单表备份恢复到目标集群,覆盖这个表的数据之后,就出现了上面的情况?

1-3全量后当时没有测SQL,也没听到研发反馈异常(可以理解查询结果正常);
4-6单表还原后才出现的异常。

去掉引号试试?

varchar的,去掉引号,查不出数据

看下 explain analyze 的结果?

mysql> explain analyze select goods_id,pid from xxxxxx where goods_id = ‘1330377950148’ and pid = ‘100000559348’;
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
| id | estRows | actRows | task | access object | execution info | operator info | memory | disk |
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
| Point_Get_1 | 1.00 | 1 | root | table:xxxxxx, index:PRIMARY(pid, goods_id) | time:4.79ms, loops:2, Get:{num_rpc:2, total_time:4.73ms} | | N/A | N/A |
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
1 row in set

mysql>

ignore index 的也试试?

mysql> explain analyze select goods_id,pid from xxxxxx ignore index(PRIMARY) where goods_id = ‘1330377950148’ and pid = ‘100000559348’;
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
| id | estRows | actRows | task | access object | execution info | operator info | memory | disk |
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
| Point_Get_1 | 1.00 | 1 | root | table:xxxxxx, index:PRIMARY(pid, goods_id) | time:4.84ms, loops:2, Get:{num_rpc:2, total_time:4.79ms} | | N/A | N/A |
±------------±--------±--------±-----±----------------------------------------------------------------±---------------------------------------------------------±--------------±-------±-----+
1 row in set

mysql>

admin check table xxxxx 试试?

顺便看下表的结构

线上在跑业务了,晚上用mysqldump 重新导一份数据后在试吧

表结构上面有的

再确认下,是否打开 new_collation?

源+目标:new_collation_enabled =False

select goods_id,pid from xxxxxx ignore index(primary) where goods_id = '1330377950148' and pid > '100000559347' and pid < '100000559349';

可以这样来避开 point get 且不走主键试试