PingKai Logo下载

ADMIN RECOVER INDEX

当行数据和索引数据不一致时,可以使用 ADMIN RECOVER INDEX 语句基于冗余索引恢复一致性。注意,该语法目前尚不支持 外键约束。

概述

AdminRecoverStmt
ADMIN RECOVER INDEX TableName IndexName

示例

假设某个数据库中的 tbl 表由于某些原因(例如在灾难恢复场景中集群中的部分行数据丢失)导致行数据和索引数据不一致:

SELECT * FROM tbl;
ERROR 1105 (HY000): inconsistent index idx handle count 2 isn't equal to value count 3

ADMIN CHECK INDEX tbl idx ;
ERROR 1105 (HY000): handle &kv.CommonHandle{encoded:[]uint8{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8}, colEndOffsets:[]uint16{0xa}}, index:types.Datum{k:0x5, decimal:0x0, length:0x0, i:0, collation:"utf8mb4_bin", b:[]uint8{0x0}, x:interface {}(nil)} != record:<nil>

从 SELECT 查询的错误信息可以看出,tbl 表包含三行数据和两行索引数据,意味着行数据和索引数据不一致。同时,至少有一行数据没有对应的索引。在这种情况下,可以使用 ADMIN RECOVER INDEX 语句补充缺失的索引:

ADMIN RECOVER INDEX tbl idx;

执行结果如下:

ADMIN RECOVER INDEX tbl idx;
+-------------+------------+
| ADDED_COUNT | SCAN_COUNT |
+-------------+------------+
|           1 |          3 |
+-------------+------------+
1 row in set (0.00 sec)

你可以再次执行 ADMIN CHECK INDEX 语句,检查数据和索引的一致性,确认数据是否已恢复正常:

ADMIN CHECK INDEX tbl idx;
Query OK, 0 rows affected (0.01 sec)

MySQL 兼容性

该语句是 TiDB 对 MySQL 语法的扩展。

相关链接