> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> CHECK TABLE 文档

# CHECK TABLE 语句

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

具体来说，它会将实际文件大小与服务器上存储的预期值进行比较。如果文件大小与存储值不一致，则说明数据已损坏。例如，这可能是查询执行期间发生系统崩溃导致的。

<Warning>
  `CHECK TABLE` 查询可能会读取表中的全部数据并占用一定资源，因此开销较大。
  执行此查询前，请先评估其对性能和资源利用率的潜在影响。
  此查询不会提升系统性能；如果你不确定自己在做什么，则不应执行。
</Warning>

<div id="syntax">
  ## 语法
</div>

查询的基本语法如下：

```sql theme={null}
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](/zh/reference/settings/session-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` 查询支持以下表引擎：

* [Log](/zh/reference/engines/table-engines/log-family/log)
* [TinyLog](/zh/reference/engines/table-engines/log-family/tinylog)
* [StripeLog](/zh/reference/engines/table-engines/log-family/stripelog)
* [MergeTree 家族](/zh/reference/engines/table-engines/mergetree-family/mergetree)

对使用其他表引擎的表执行该查询会导致 `NOT_IMPLEMENTED` 异常。

`*Log` 家族中的引擎在发生故障时不提供自动数据恢复。请使用 `CHECK TABLE` 查询及时发现数据丢失。

<div id="examples">
  ## 示例
</div>

默认情况下，`CHECK TABLE` 查询会显示表的整体检查状态：

```sql title="Query" theme={null}
CHECK TABLE test_table;
```

```text title="Response" theme={null}
┌─result─┐
│      1 │
└────────┘
```

如果你想查看每个分片各自的检查状态，可以使用 `check_query_single_value_result` 设置。

此外，如需检查表中的特定分区，可以使用 `PARTITION` 关键字。

```sql title="Query" theme={null}
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
│ 201003_3_3_0 │         1 │         │
└──────────────┴───────────┴─────────┘
```

同样，也可以使用 `PART` 关键字来检查表的特定分片。

```sql title="Query" theme={null}
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │         1 │         │
└──────────────┴───────────┴─────────┘
```

请注意：当分片不存在时，查询会返回错误：

```sql title="Query" theme={null}
CHECK TABLE t0 PART '201003_111_222_0'
```

```text title="Response" theme={null}
DB::Exception: No such data part '201003_111_222_0' to check in table 'default.t0'. (NO_SUCH_DATA_PART)
```

<div id="receiving-a-corrupted-result">
  ### 收到“Corrupted”结果
</div>

<Warning>
  免责声明：此处描述的操作 (包括直接在数据目录中手动修改或删除文件) 仅适用于实验性环境或开发环境。**请勿**在生产服务器上尝试此操作，否则可能导致数据丢失或其他意外后果。
</Warning>

删除现有的校验和文件：

```bash theme={null}
rm /var/lib/clickhouse-server/data/default/t0/201003_3_3_0/checksums.txt
```

```sql title="Query" theme={null}
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text title="Response" theme={null}
┌─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` 表。

```sql theme={null}
CHECK ALL TABLES
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0
```

```text theme={null}
┌─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 │         │
└──────────┴──────────┴─────────────┴───────────┴─────────┘
```

<div id="if-the-data-is-corrupted">
  ## 如果数据已损坏
</div>

如果表已损坏，您可以将未损坏的数据复制到另一张表中。为此：

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` 的值。
