Запрос CHECK TABLE в ClickHouse используется для проверки указанной таблицы или её партиций. Он обеспечивает целостность данных, проверяя контрольные суммы и другие внутренние структуры данных.
В частности, он сравнивает фактические размеры файлов с ожидаемыми значениями, которые хранятся на сервере. Если размеры файлов не совпадают с сохранёнными значениями, это означает, что данные повреждены. Это может быть вызвано, например, сбоем системы во время выполнения запроса.
Синтаксис
Ниже приведён базовый синтаксис запроса:
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 в значение больше единицы.
- (Необязательно): check_query_single_value_result: Эта настройка определяет, будет ли вывод подробным (
Ответ на запрос зависит от значения настройки 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 TABLE test_table;┌─result─┐
│ 1 │
└────────┘Если вы хотите видеть статус проверки для каждой отдельной части данных, можно использовать настройку check_query_single_value_result.
Кроме того, чтобы проверить конкретную партицию таблицы, можно использовать ключевое слово PARTITION.
CHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
│ 201003_3_3_0 │ 1 │ │
└──────────────┴───────────┴─────────┘Аналогично можно проверить конкретную часть таблицы с помощью ключевого слова PART.
CHECK TABLE t0 PART '201003_7_7_0'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─part_path────┬─is_passed─┬─message─┐
│ 201003_7_7_0 │ 1 │ │
└──────────────┴───────────┴─────────┘Обратите внимание: если такой части не существует, запрос возвращает ошибку:
CHECK TABLE t0 PART '201003_111_222_0'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.txtCHECK TABLE t0 PARTITION ID '201003'
FORMAT PrettyCompactMonoBlock
SETTINGS check_query_single_value_result = 0┌─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.
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 │ │
└──────────┴──────────┴─────────────┴───────────┴─────────┘Чтобы проверить состояние всей базы данных, а не целостность отдельных таблиц, используйте запрос CHECK DATABASE. Он в первую очередь предназначен для баз данных с движком DataLakeCatalog, где проверяет, доступен ли внешний каталог.
Если данные повреждены
Если таблица повреждена, вы можете скопировать неповрежденные данные в другую таблицу. Для этого:
- Создайте новую таблицу с той же структурой, что и поврежденная. Для этого выполните запрос
CREATE TABLE <new_table_name> AS <damaged_table_name>. - Установите значение
max_threadsравным 1, чтобы следующий запрос выполнялся в одном потоке. Для этого выполните запросSET max_threads = 1. - Выполните запрос
INSERT INTO <new_table_name> SELECT * FROM <damaged_table_name>. Он скопирует неповрежденные данные из поврежденной таблицы в другую. Будут скопированы только данные, расположенные до поврежденной части. - Перезапустите
clickhouse-client, чтобы сбросить значениеmax_threads.