跳至主要内容

CHECK TABLE 语句

ClickHouse 中的 `CHECK TABLE` 查询用于对特定表或其分区执行验证检查。它通过验证校验和和其他内部数据结构来确保数据的完整性。

具体来说,它将实际文件大小与存储在服务器上的预期值进行比较。如果文件大小与存储的值不匹配,则意味着数据已损坏。例如,这可能是由于查询执行期间系统崩溃造成的。

注意

`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 设置为大于一的数字,以加快查询速度。

查询响应取决于 contains check_query_single_value_result 设置的值。如果 check_query_single_value_result = 1,则只返回包含单个行的 result 列。此行中的值如果完整性检查通过,则为 1,如果数据损坏,则为 0

如果 check_query_single_value_result = 0,则查询将返回以下列

- `part_path`: Indicates the path to the data part or file name.
- `is_passed`: Returns 1 if the check for this part is successful, 0 otherwise.
- `message`: Any additional messages related to the check, such as errors or success messages.

`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.txt
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0


Output:

```text
┌─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 │ │
└──────────┴──────────┴─────────────┴───────────┴─────────┘

如果数据已损坏

如果表已损坏,您可以将未损坏的数据复制到另一个表。为此,请

  1. 创建一个与损坏表具有相同结构的新表。为此,请执行查询 CREATE TABLE <new_table_name> AS <damaged_table_name>
  2. max_threads 值设置为 1,以便在单个线程中处理下一个查询。为此,请运行查询 SET max_threads = 1
  3. 执行查询 INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>。此请求将损坏表中的未损坏数据复制到另一个表。只会复制损坏部分之前的数据。
  4. 重新启动 clickhouse-client 以重置 max_threads 值。