Оператор 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
.
Вывод:
Обратите внимание, что если часть не существует, запрос возвращает ошибку:
Получение результата 'Corrupted'
Отказ от ответственности: Описанная здесь процедура, включая ручное манипулирование или удаление файлов непосредственно из каталога данных, предназначена только для экспериментальных или девелопмент-окружений. Не пытайтесь делать это на рабочем сервере, так как это может привести к потере данных или другим нежелательным последствиям.
Удалите существующий файл контрольной суммы:
Вывод:
Если файл checksums.txt отсутствует, его можно восстановить. Он будет перерассчитан и переписан во время выполнения команды CHECK TABLE для конкретной партиции, и статус по-прежнему будет сообщаться как 'is_passed = 1'.
Вы можете проверить все существующие таблицы (Replicated)MergeTree
сразу, используя запрос CHECK ALL TABLES
.
Если данные повреждены
Если таблица повреждена, вы можете скопировать неповрежденные данные в другую таблицу. Для этого:
- Создайте новую таблицу с такой же структурой, как у поврежденной таблицы. Для этого выполните запрос
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
.