> ## 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

Запрос `CHECK TABLE` в ClickHouse используется для проверки указанной таблицы или её партиций. Он обеспечивает целостность данных, проверяя контрольные суммы и другие внутренние структуры данных.

В частности, он сравнивает фактические размеры файлов с ожидаемыми значениями, которые хранятся на сервере. Если размеры файлов не совпадают с сохранёнными значениями, это означает, что данные повреждены. Это может быть вызвано, например, сбоем системы во время выполнения запроса.

<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](/ru/reference/settings/session-settings#check_query_single_value_result): Эта настройка определяет, будет ли вывод подробным (`0`) или сводным (`1`).
  * Можно также применять и другие настройки. Если детерминированный порядок результатов не требуется, для ускорения запроса можно установить max\_threads в значение больше единицы.

Ответ на запрос зависит от значения настройки `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](/ru/reference/engines/table-engines/log-family/log)
* [TinyLog](/ru/reference/engines/table-engines/log-family/tinylog)
* [StripeLog](/ru/reference/engines/table-engines/log-family/stripelog)
* [семейство MergeTree](/ru/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'.

Вы можете проверить все существующие таблицы `(Replicated)MergeTree` сразу с помощью запроса `CHECK ALL TABLES`.

```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`.
