16 KiB
Прочие виды запросов
ATTACH
Запрос полностью аналогичен запросу CREATE
, но:
- вместо слова
CREATE
используется словоATTACH
; - запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице на сервер. После выполнения запроса
ATTACH
сервер будет знать о существовании таблицы.
Если таблица перед этим была отсоединена (DETACH
), т.е. её структура известна, можно использовать сокращенную форму записи без определения структуры.
ATTACH TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
Этот запрос используется при старте сервера. Сервер хранит метаданные таблиц в виде файлов с запросами ATTACH
, которые он просто исполняет при запуске (за исключением системных таблиц, которые явно создаются на сервере).
CHECK TABLE
Проверяет таблицу на повреждение данных.
CHECK TABLE [db.]name
Запрос CHECK TABLE
сравнивает текущие размеры файлов (в которых хранятся данные из колонок) с ожидаемыми значениями. Если значения не совпадают, данные в таблице считаются поврежденными. Искажение возможно, например, из-за сбоя при записи данных.
Ответ содержит колонку result
, содержащую одну строку с типом Boolean. Допустимые значения:
- 0 - данные в таблице повреждены;
- 1 - данные не повреждены.
Запрос CHECK TABLE
поддерживает следующие движки таблиц:
При попытке выполнить запрос с таблицами с другими табличными движками, ClickHouse генерирует исключение.
В движках *Log
не предусмотрено автоматическое восстановление данных после сбоя. Используйте запрос CHECK TABLE
, чтобы своевременно выявлять повреждение данных.
Для движков из семейства MergeTree
запрос CHECK TABLE
показывает статус проверки для каждого отдельного куска данных таблицы на локальном сервере.
Что делать, если данные повреждены
В этом случае можно скопировать оставшиеся неповрежденные данные в другую таблицу. Для этого:
- Создайте новую таблицу с такой же структурой, как у поврежденной таблицы. Для этого выполните запрос
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
.
DESCRIBE TABLE
DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
Возвращает описание столбцов таблицы.
Результат запроса содержит столбцы (все столбцы имеют тип String):
name
— имя столбца таблицы;type
— тип столбца;default_type
— в каком виде задано выражение для значения по умолчанию:DEFAULT
,MATERIALIZED
илиALIAS
. Столбец содержит пустую строку, если значение по умолчанию не задано.default_expression
— значение, заданное в секцииDEFAULT
;comment_expression
— комментарий к столбцу.
Вложенные структуры данных выводятся в «развёрнутом» виде. То есть, каждый столбец - по отдельности, с именем через точку.
DETACH
Удаляет из сервера информацию о таблице name. Сервер перестаёт знать о существовании таблицы.
DETACH TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
Но ни данные, ни метаданные таблицы не удаляются. При следующем запуске сервера, сервер прочитает метаданные и снова узнает о таблице.
Также, «отцепленную» таблицу можно прицепить заново запросом ATTACH
(за исключением системных таблиц, для которых метаданные не хранятся).
Запроса DETACH DATABASE
нет.
DROP
Запрос имеет два вида: DROP DATABASE
и DROP TABLE
.
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
Удаляет все таблицы внутри базы данных db, а затем саму базу данных db.
Если указано IF EXISTS
- не выдавать ошибку, если база данных не существует.
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
Удаляет таблицу.
Если указано IF EXISTS
- не выдавать ошибку, если таблица не существует или база данных не существует.
EXISTS
EXISTS [TEMPORARY] TABLE [db.]name [INTO OUTFILE filename] [FORMAT format]
Возвращает один столбец типа UInt8
, содержащий одно значение - 0
, если таблицы или БД не существует и 1
, если таблица в указанной БД существует.
KILL QUERY
KILL QUERY [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.processes query>
[SYNC|ASYNC|TEST]
[FORMAT format]
Пытается принудительно остановить исполняющиеся в данный момент запросы.
Запросы для принудительной остановки выбираются из таблицы system.processes с помощью условия, указанного в секции WHERE
запроса KILL
.
Примеры
-- Принудительно останавливает все запросы с указанным query_id:
KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90'
-- Синхронно останавливает все запросы пользователя 'username':
KILL QUERY WHERE user='username' SYNC
Readonly-пользователи могут останавливать только свои запросы.
По умолчанию используется асинхронный вариант запроса (ASYNC
), который не дожидается подтверждения остановки запросов.
Синхронный вариант (SYNC
) ожидает остановки всех запросов и построчно выводит информацию о процессах по ходу их остановки.
Ответ содержит колонку kill_status
, которая может принимать следующие значения:
- ‘finished’ - запрос был успешно остановлен;
- ‘waiting’ - запросу отправлен сигнал завершения, ожидается его остановка;
- остальные значения описывают причину невозможности остановки запроса.
Тестовый вариант запроса (TEST
) только проверяет права пользователя и выводит список запросов для остановки.
KILL MUTATION
KILL MUTATION [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.mutations query>
[TEST]
[FORMAT format]
Пытается остановить выполняющиеся в данные момент мутации. Мутации для остановки выбираются из таблицы system.mutations
с помощью условия, указанного в секции WHERE
запроса KILL
.
Тестовый вариант запроса (TEST
) только проверяет права пользователя и выводит список запросов для остановки.
Примеры:
-- Останавливает все мутации одной таблицы:
KILL MUTATION WHERE database = 'default' AND table = 'table'
-- Останавливает конкретную мутацию:
KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt'
Запрос полезен в случаях, когда мутация не может выполниться до конца (например, если функция в запросе мутации бросает исключение на данных таблицы).
Данные, уже изменённые мутацией, остаются в таблице (отката на старую версию данных не происходит).
OPTIMIZE
OPTIMIZE TABLE [db.]name [ON CLUSTER cluster] [PARTITION partition | PARTITION ID 'partition_id'] [FINAL] [DEDUPLICATE]
Запрос пытается запустить внеплановый мёрж кусков данных для таблиц семейства MergeTree. Другие движки таблиц не поддерживаются.
Если OPTIMIZE
применяется к таблицам семейства ReplicatedMergeTree, ClickHouse создаёт задачу на мёрж и ожидает её исполнения на всех узлах (если активирована настройка replication_alter_partitions_sync
).
- Если
OPTIMIZE
не выполняет мёрж по любой причине, ClickHouse не оповещает об этом клиента. Чтобы включить оповещения, используйте настройку optimize_throw_if_noop. - Если указать
PARTITION
, то оптимизация выполняется только для указанной партиции. Как задавать имя партиции в запросах. - Если указать
FINAL
, то оптимизация выполняется даже в том случае, если все данные уже лежат в одном куске. - Если указать
DEDUPLICATE
, то произойдет схлопывание полностью одинаковых строк (сравниваются значения во всех колонках), имеет смысл только для движка MergeTree.
!!! warning "Внимание"
Запрос OPTIMIZE
не может устранить причину появления ошибки «Too many parts».
RENAME
Переименовывает одну или несколько таблиц.
RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster]
Все таблицы переименовываются под глобальной блокировкой. Переименовывание таблицы является лёгкой операцией. Если вы указали после TO другую базу данных, то таблица будет перенесена в эту базу данных. При этом, директории с базами данных должны быть расположены в одной файловой системе (иначе возвращается ошибка).
SET
SET param = value
Устанавливает значение value
для настройки param
в текущей сессии. Конфигурационные параметры сервера нельзя изменить подобным образом.
Можно одним запросом установить все настройки из заданного профиля настроек.
SET profile = 'profile-name-from-the-settings-file'
Подробности смотрите в разделе Настройки.
TRUNCATE
TRUNCATE TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
Удаляет все данные из таблицы. Если условие IF EXISTS
не указано, запрос вернет ошибку, если таблицы не существует.
Запрос TRUNCATE
не поддерживается для следующих движков: View, File, URL и Null.
USE
USE db
Позволяет установить текущую базу данных для сессии. Текущая база данных используется для поиска таблиц, если база данных не указана в запросе явно через точку перед именем таблицы. При использовании HTTP протокола запрос не может быть выполнен, так как понятия сессии не существует.