ClickHouse の CHECK TABLE クエリは、特定のテーブルまたはそのパーティションに対して整合性チェックを実行するために使用されます。チェックサムやその他の内部データ構造を検証することで、データの整合性を確認します。
特に、実際のファイルサイズとサーバーに保存されている想定値を比較します。ファイルサイズが保存済みの値と一致しない場合、データが破損していることを意味します。これは、たとえばクエリ実行中のシステムクラッシュによって発生することがあります。
構文
クエリの基本構文は次のとおりです。
CHECK TABLE table_name [PARTITION partition_expression | PART part_name] [FORMAT format] [SETTINGS check_query_single_value_result = (0|1) [, other_settings]]table_name: チェック対象のテーブル名を指定します。partition_expression: (任意) テーブル内の特定のパーティションをチェックする場合は、この式でパーティションを指定できます。part_name: (任意) テーブル内の特定の パート をチェックする場合は、パート 名を指定する文字列リテラルを追加できます。FORMAT format: (任意) 結果の出力フォーマットを指定できます。SETTINGS: (任意) 追加の設定を指定できます。- (任意) : check_query_single_value_result: この設定は、出力を詳細表示 (
0) にするか要約表示 (1) にするかを制御します。 - 他の設定も適用できます。結果の順序が決定論的である必要がない場合は、クエリを高速化するために max_threads を 1 より大きい値に設定できます。
- (任意) : check_query_single_value_result: この設定は、出力を詳細表示 (
クエリの応答は、check_query_single_value_result 設定の値によって異なります。
check_query_single_value_result = 1 の場合は、1 行のみを含む result カラムだけが返されます。この行の値は、整合性チェックに合格した場合は 1、データが破損している場合は 0 です。
check_query_single_value_result = 0 の場合、クエリは次のカラムを返します。
part_path: データパート へのパス、またはファイル名を示します。is_passed: この パート のチェックが成功した場合は 1、それ以外の場合は 0 を返します。message: エラーや成功メッセージなど、チェックに関連する追加メッセージです。
CHECK TABLE クエリは、次のテーブルエンジンをサポートしています。
それ以外のテーブルエンジンのテーブルに対して実行すると、NOT_IMPLEMENTED 例外が発生します。
*Log ファミリーのエンジンでは、障害発生時の自動データ復旧は提供されません。データ損失を適時に把握するために、CHECK TABLE クエリを使用してください。
例
デフォルトでは、CHECK TABLE クエリにより、テーブルチェックの全体的なステータスが表示されます:
CHECK TABLE test_table;┌─result─┐
│ 1 │
└────────┘個々のデータパートごとのチェック結果を確認したい場合は、check_query_single_value_result 設定を使用できます。
また、テーブル内の特定のパーティションをチェックするには、PARTITION キーワードを使用できます。
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
│ 201003_3_3_0 │ 1 │ │
└──────────────┴───────────┴─────────┘同様に、PART キーワードを使用すると、テーブル内の特定のパートを確認できます。
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
└──────────────┴───────────┴─────────┘パート が存在しない場合、クエリはエラーを返す点に注意してください:
CHECK TABLE t0 PART '201003_111_222_0'DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)「破損」した結果を受け取る
既存のチェックサムファイルを削除します:
rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txtCHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message──────────────────────────────────┐
│ 201003_7_7_0 │ 1 │ │
│ 201003_3_3_0 │ 1 │ Checksums recounted and written to disk. │
└──────────────┴───────────┴──────────────────────────────────────────┘checksums.txt ファイルがない場合でも、復元できます。特定のパーティションに対して CHECK TABLE コマンドを実行すると、実行中に再計算されて書き直され、ステータスは引き続き 'is_passed = 1' と報告されます。
CHECK ALL TABLES クエリを使用すると、既存のすべての (Replicated)MergeTree テーブルをまとめて確認できます。
CHECK ALL TABLES
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─database─┬─table────┬─part_path───┬─is_passed─┬─message─┐
│ default │ t2 │ all_1_95_3 │ 1 │ │
│ db1 │ table_01 │ all_39_39_0 │ 1 │ │
│ default │ t1 │ all_39_39_0 │ 1 │ │
│ db1 │ t1 │ all_39_39_0 │ 1 │ │
│ db1 │ table_01 │ all_1_6_1 │ 1 │ │
│ default │ t1 │ all_1_6_1 │ 1 │ │
│ db1 │ t1 │ all_1_6_1 │ 1 │ │
│ db1 │ table_01 │ all_7_38_2 │ 1 │ │
│ db1 │ t1 │ all_7_38_2 │ 1 │ │
│ default │ t1 │ all_7_38_2 │ 1 │ │
└──────────┴──────────┴─────────────┴───────────┴─────────┘個々のテーブルの整合性ではなく、データベース全体の健全性を確認するには、CHECK DATABASE クエリを使用します。これは主に DataLakeCatalog エンジンを使用するデータベース向けで、外部カタログに到達可能かどうかを検証します。
データが破損している場合
テーブルが破損している場合は、破損していないデータを別のテーブルにコピーできます。手順は次のとおりです。
- 破損したテーブルと同じ構造を持つ新しいテーブルを作成します。これを行うには、クエリ
CREATE TABLE <new_table_name> AS <damaged_table_name>を実行します。 - 次のクエリを単一スレッドで処理するため、
max_threadsの値を 1 に設定します。これを行うには、クエリSET max_threads = 1を実行します。 - クエリ
INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>を実行します。この操作により、破損したテーブルから破損していないデータが別のテーブルにコピーされます。コピーされるのは、破損したパーツより前のデータのみです。 max_threadsの値をリセットするため、clickhouse-clientを再起動します。