Перейти к основному содержимому
Перейти к основному содержимому

Оператор CHECK TABLE

Запрос 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 показывает общий статус проверки таблицы:

Если вы хотите видеть статус проверки для каждой отдельной части данных, вы можете использовать настройку check_query_single_value_result.

Также для проверки конкретного раздела таблицы вы можете использовать ключевое слово PARTITION.

Вывод:

Аналогично, вы можете проверить конкретную часть таблицы, используя ключевое слово PART.

Вывод:

Обратите внимание, что когда часть не существует, запрос возвращает ошибку:

Получение результата 'Повреждено'

осторожно

Отказ от ответственности: описанная здесь процедура, включая ручное манипулирование или удаление файлов непосредственно из каталога данных, предназначена только для экспериментальных или разработческих сред. Не пытайтесь делать это на сервере в производственной среде, так как это может привести к потере данных или другим непредвиденным последствиям.

Удалите существующий файл контрольной суммы:

Вывод:

Если файл 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.