CHECK TABLE Statement
Проверяет таблицу на повреждение данных.
CHECK TABLE [db.]name
Запрос CHECK TABLE
сравнивает текущие размеры файлов (в которых хранятся данные из колонок) с ожидаемыми значениями. Если значения не совпадают, данные в таблице считаются поврежденными. Искажение возможно, например, из-за сбоя при записи данных.
Ответ содержит колонку result
, содержащую одну строку с типом Boolean. Допустимые значения:
- 0 - данные в таблице повреждены;
- 1 - данные не повреждены.
Запрос CHECK TABLE
поддерживает следующие движки таблиц:
При попытке выполнить запрос с таблицами с другими табличными движками, ClickHouse генерирует исключение.
В движках *Log
не предусмотрено автоматическое восстановление данных после сбоя. Используйте запрос CHECK TABLE
, чтобы своевременно выявлять повреждение данных.
Проверка таблиц семейства MergeTree
Для таблиц семейства MergeTree
если check_query_single_value_result = 0, запрос CHECK TABLE
возвращает статус каждого куска данных таблицы на локальном сервере.
SET check_query_single_value_result = 0;
CHECK TABLE test_table;
┌─part_path─┬─is_passed─┬─message─┐
│ all_1_4_1 │ 1 │ │
│ all_1_4_2 │ 1 │ │
└───────────┴───────────┴─────────┘
Если check_query_single_value_result
= 1, запрос CHECK TABLE
возвращает статус таблицы в целом.
SET check_query_single_value_result = 1;
CHECK TABLE test_table;
┌─result─┐
│ 1 │
└────────┘
Что делать, если данные повреждены
В этом случае можно скопировать оставшиеся неповрежденные данные в другую таблицу. Для этого:
- Создайте новую таблицу с такой же структурой, как у поврежденной таблицы. Для этого выполните запрос
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
.