管理者リカバリインデックス

行データとインデックスデータに不整合がある場合、 ADMIN RECOVER INDEXステートメントを使用して、冗長化されたインデックスに基づいて整合性を回復できます。この構文はまだ外部キー制約をサポートしていないことに注意してください。

あらすじ

AdminCleanupStmt
ADMINRECOVERINDEXTableNameIndexName

何らかの理由により、データベース内の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テーブルには 3 行のデータと 2 行のインデックス データが含まれていることがわかります。これは、行データとインデックス データが矛盾していることを意味します。同時に、少なくとも 1 行のデータには対応するインデックスがありません。この場合、 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)

注記:

レプリカの損失によりデータとインデックスが不整合になった場合:

  • 行データとインデックス データの両方が失われる可能性があります。この問題に対処するには、 ADMIN CLEANUP INDEXADMIN RECOVER INDEXステートメントを一緒に使用して、行データとインデックス データの整合性を回復します。
  • ADMIN RECOVER INDEXステートメントは常に単一スレッドで実行されます。テーブルデータが大きい場合は、インデックスを再構築してインデックスデータを回復することをお勧めします。
  • ADMIN RECOVER INDEXステートメントを実行すると、対応するテーブルまたはインデックスはロックされず、TiDB は他のセッションがテーブル レコードを同時に変更できるようになります。ただし、この場合、 ADMIN RECOVER INDEXすべてのテーブル レコードを正しく処理できない可能性があります。したがって、 ADMIN RECOVER INDEXを実行するときは、テーブルのデータを同時に変更しないようにしてください。
  • TiDB のエンタープライズ エディションを使用している場合は、サポート エンジニアにリクエストを送信するして支援を求めることができます。

ADMIN RECOVER INDEXステートメントはアトミックではありません。ステートメントが実行中に中断された場合は、成功するまで再実行することをお勧めします。

MySQLの互換性

このステートメントは、MySQL 構文に対する TiDB 拡張機能です。

こちらも参照

このページは役に立ちましたか?