跳转到主要内容
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 设置为大于 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 查询会显示表的整体检查状态:
Query
CHECK TABLE test_table;
Response
┌─result─┐
│      1 │
└────────┘
如果你想查看每个分片各自的检查状态,可以使用 check_query_single_value_result 设置。 此外,如需检查表中的特定分区,可以使用 PARTITION 关键字。
Query
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
│ 201003_3_3_0 │         1 │         │
└──────────────┴───────────┴─────────┘
同样,也可以使用 PART 关键字来检查表的特定分片。
Query
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
└──────────────┴───────────┴─────────┘
请注意:当分片不存在时,查询会返回错误:
Query
CHECK TABLE t0 PART '201003_111_222_0'
Response
DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)

收到“Corrupted”结果

免责声明:此处描述的操作 (包括直接在数据目录中手动修改或删除文件) 仅适用于实验性环境或开发环境。请勿在生产服务器上尝试此操作,否则可能导致数据丢失或其他意外后果。
删除现有的校验和文件:
rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txt
Query
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
Response
┌─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 的值。
最后修改于 2026年6月10日