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

Оператор CHECK TABLE

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

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

предупреждение

Запрос CHECK TABLE может читать все данные в таблице и занимать некоторые ресурсы, что делает его ресурсозатратным. Учтите потенциальное влияние на производительность и использование ресурсов перед выполнением этого запроса. Этот запрос не улучшит производительность системы, и вы не должны выполнять его, если не уверены в том, что делаете.

Синтаксис

Базовый синтаксис запроса выглядит следующим образом:

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 = 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.txt
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 │ 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 │         │
└──────────┴──────────┴─────────────┴───────────┴─────────┘

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

Если таблица повреждена, вы можете скопировать неповрежденные данные в другую таблицу. Для этого:

  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.