ClickHouse/docs/ru/sql-reference/statements/check-table.md
2022-04-09 07:29:05 -06:00

4.2 KiB
Raw Blame History

sidebar_position sidebar_label
41 CHECK

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 = 0, запрос CHECK TABLE возвращает статус таблицы в целом.

SET check_query_single_value_result = 1;
CHECK TABLE test_table;
┌─result─┐
│      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.