Перейти к основному содержанию
Запрос CHECK TABLE в ClickHouse используется для проверки указанной таблицы или её партиций. Он обеспечивает целостность данных, проверяя контрольные суммы и другие внутренние структуры данных. В частности, он сравнивает фактические размеры файлов с ожидаемыми значениями, которые хранятся на сервере. Если размеры файлов не совпадают с сохранёнными значениями, это означает, что данные повреждены. Это может быть вызвано, например, сбоем системы во время выполнения запроса.
Запрос CHECK TABLE может читать все данные в таблице и занимать часть ресурсов, поэтому он может быть ресурсоёмким. Перед выполнением этого запроса учитывайте его возможное влияние на производительность и потребление ресурсов. Этот запрос не улучшает производительность системы, и его не следует выполнять, если вы не уверены в своих действиях.

Синтаксис

Ниже приведён базовый синтаксис запроса:
  • table_name: Указывает имя таблицы, которую нужно проверить.
  • partition_expression: (Необязательно) Если нужно проверить конкретную партицию таблицы, это выражение можно использовать для указания партиции.
  • part_name: (Необязательно) Если нужно проверить конкретную часть таблицы, можно добавить строковый литерал с именем части.
  • FORMAT format: (Необязательно) Позволяет указать формат вывода результата.
  • 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 поддерживает следующие движки таблиц: Выполнение для таблиц с другими движками таблиц приводит к исключению NOT_IMPLEMENTED. Движки из семейства *Log не обеспечивают автоматическое восстановление данных при сбое. Используйте запрос CHECK TABLE, чтобы своевременно отслеживать потерю данных.

Примеры

По умолчанию запрос CHECK TABLE показывает общий статус проверки таблицы:
Query
Response
Если вы хотите видеть статус проверки для каждой отдельной части данных, можно использовать настройку check_query_single_value_result. Кроме того, чтобы проверить конкретную партицию таблицы, можно использовать ключевое слово PARTITION.
Query
Response
Аналогично можно проверить конкретную часть таблицы с помощью ключевого слова PART.
Query
Response
Обратите внимание: если такой части не существует, запрос возвращает ошибку:
Query
Response

Получение результата «Corrupted»

Предупреждение: описанная здесь процедура, включая ручное изменение или удаление файлов непосредственно из каталога данных, предназначена только для экспериментальных сред и сред разработки. Не пытайтесь выполнять это на рабочем сервере, так как это может привести к потере данных или другим непредвиденным последствиям.
Удалите существующий файл контрольной суммы:
Query
Response
Если файл checksums.txt отсутствует, его можно восстановить. Он будет заново вычислен и перезаписан при выполнении команды CHECK TABLE для конкретной партиции, а статус всё равно будет отображаться как ‘is_passed = 1’. Вы можете проверить все существующие таблицы (Replicated)MergeTree сразу с помощью запроса CHECK ALL TABLES.

Если данные повреждены

Если таблица повреждена, вы можете скопировать неповрежденные данные в другую таблицу. Для этого:
  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.
Последнее изменение 19 июня 2026 г.