【TiDB 使用环境】测试环境
【TiDB 版本】v8.5.6
【BR版本】v8.5.6
【部署方式】虚拟机
【遇到的问题:问题现象及影响】
通过BR工具对TIDB数据库进行备份还原后,用全局索引查询时会报数据不一致,报错信息如下:
SQL 错误 [8133] [HY000]: data inconsistency in table: AliExpressOrderItem, index: IDX_AliExpressOrderItem_Globa, index-count:1 != record-count:0
查询语句如下,在order_id字段上创建了全局索引:
SELECT * from Order_Test.AliExpressOrderItem
WHERE order_id='8122954138504196'
用以下两个语句检查的时候都没有问题
ADMIN CHECK TABLE AliExpressOrderItem
ADMIN CHECK INDEX AliExpressOrder IDX_AliExpressOrder_Globa
请问这是什么原因?
1 个赞
wbslxw
(Ti D Ber Cl S0j Eng)
2
全局索引(Global Index)BR 备份还原逻辑缺陷,局部索引 KV 与行数据 KV 数量不匹配(索引多 / 缺行、缺索引行),ADMIN CHECK 全量校验无异常,但单点条件命中该脏数据行时触发一致性校验报错
1 个赞
mtmt
(Ti D Ber O1 Snfo3y)
4
ALTER TABLE … REBUILD GLOBAL INDEX重建异常全局索引;
后续备份前等待全局索引后台合并任务完成再执行 BR。
1 个赞
这种bug怎么一直没有修复啊,有什么方法可以解决吗?
1 个赞
ALTER TABLE … REBUILD GLOBAL INDEX
这样重建索引会报语法错误,先删除再创建是可以,不过表比较大,服务器的配置又比较低,重新创建一个大表的索引十几二十个小时。
1 个赞
菩提老祖
(菩提老祖)
8
孤儿索引键(dangling / orphan index key)——全局索引里有一条 order_id='8122954138504196'的索引记录,指向某一行的 handle,但你顺着那个 handle 去找行数据时,那行数据已经不在了。索引悬空了。
重建索引, 或者ADMIN RECOVER INDEX修复索引
1 个赞
从 MySQL 迁到 TiDB,如果原来用了自增主键,高并发下会产生写入热点,因为所有写操作都集中在同一个 Region。建议评估下改成 AUTO_RANDOM 或者业务自己生成分布式ID,利用 TiDB 的 Region 自动拆分机制提高写入吞吐。
1 个赞
独善其身
(Ti D Ber Bi Rqfz5 K)
10
BR 恢复全局索引 (GLOBAL INDEX) SST 重写异常,残留孤立全局索引 KV、行记录 KV 被彻底抹除;ADMIN CHECK 全表 / 全索引无报错、单点条件查询报 8133 是全局索引独有的校验逻辑差异
1 个赞
TiDB001
(Ti D Ber G Ec Kbxr N)
11
检查索引IDX_AliExpressOrderItem_Global的状态是否完好。如果索引损坏,你可以尝试重建索引
1 个赞
不是只有一行数据有问题,而是随便一行数据都有问题,数据库里有40个表建了全局索引,40个表都有问题,应该不是简单的孤儿索引键的问题。如果只能通过后期修复,感觉不太靠谱啊
1 个赞
感觉不像只是残留,好像整个索引都有问题,随便查一个值都有问题。
这个是用BR恢复的时候重写异常吗?还是在备份的时候就已经异常了?怎么避免这样的异常呢?
1 个赞
删全局索引,重新CREATE GLOBAL INDEX重建;
TiDB 的兼容性跟执行计划的生成机制有关,同样的 SQL 在 MySQL 和 TiDB 上的优化器决策可能不同,特别是子查询和 JOIN 的处理方式。迁移前建议用 SQL Plan Management 做下 SQL 兼容性扫描。
TiDB_001
(Ti D Ber No L Znn Vd)
19
备份前等待全局索引后台合并任务完成,避免备份时索引数据异常
狂拽瘸子好腿
(Ti D Ber 8u Uk Olqy)
20
大概率是 BR 还原后全局索引的 Region 数据未完成异步修复 / 分裂迁移,或索引统计元数据快照与实际物理数据存在短时偏差,一致性校验命令仅做静态快照检测没触发实时检索所以未告警。
备份还原后全局索引不一致,建议用BR的checksum校验功能检查数据一致性。也可以重建索引试一下。