CHECK TABLE ステートメント
ClickHouse における CHECK TABLE クエリは、特定のテーブルまたはそのパーティションに対して検証を実行するために使用されます。チェックサムやその他の内部データ構造を検証することで、データの整合性を確認します。
特に、サーバー上に保存されている期待されるファイルサイズと実際のファイルサイズを比較します。ファイルサイズが保存されている値と一致しない場合、データが破損していることを意味します。これは、例えばクエリ実行中のシステムクラッシュなどが原因で発生することがあります。
CHECK TABLE クエリはテーブル内のすべてのデータを読み取り、多くのリソースを占有する可能性があるため、リソース負荷の高い処理となる場合があります。
このクエリを実行する前に、パフォーマンスやリソース使用量への影響を十分に考慮してください。
このクエリはシステムのパフォーマンスを向上させるものではなく、何をしているか確信が持てない場合には実行すべきではありません。
構文
クエリの基本的な構文は次のとおりです。
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 = 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_query_single_value_result 設定を使用できます。
また、テーブルの特定パーティションをチェックするには、PARTITION キーワードを使用できます。
出力:
同様に、PART キーワードを使用してテーブルの特定の部分だけを確認することもできます。
出力:
パーツが存在しない場合、クエリはエラーを返します。
「Corrupted(破損)」という結果を受け取った場合
免責事項: ここで説明する手順(データディレクトリ内のファイルを手動で操作・削除することを含みます)は、実験環境または開発環境でのみ使用してください。本番サーバーでは絶対に実行しないでください。データ損失やその他の予期しない結果を招くおそれがあります。
既存のチェックサムファイルを削除します:
checksums.txt ファイルが存在しない場合は、復元できます。特定のパーティションに対して CHECK TABLE コマンドを実行する際に再計算および再書き込みされ、ステータスは引き続き 'is_passed = 1' として報告されます。
CHECK ALL TABLES クエリを使用すると、既存の (Replicated)MergeTree テーブルをすべて一度にチェックできます。
データが破損している場合
テーブルが破損している場合は、破損していないデータを別のテーブルにコピーできます。そのためには、次の手順を実行します。
- 破損したテーブルと同じ構造を持つ新しいテーブルを作成します。これには、クエリ
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を再起動します。