Завершение запросов и отключение сеансов: руководство по команде KILL
Команда KILL отменяет выполняющийся запрос или отключает указанный сеанс. Перед её использованием получите идентификатор нужного запроса (Query ID, Connection ID или Trace ID), затем выполните соответствующий оператор KILL.
Получение идентификаторов запросов
Команда KILL поддерживает следующие три типа идентификаторов запросов:
| Тип идентификатора | Описание | Способ получения |
|---|---|---|
| Query ID | Уникальный идентификатор, который система автоматически создаёт для каждого запроса | SHOW PROCESSLIST или information_schema.processlist |
| Connection ID | Уникальный идентификатор соединения сеанса | SHOW PROCESSLIST или information_schema.processlist |
| Trace ID | Пользовательский идентификатор запроса (поддерживается начиная с 2.1.11 / 3.0.7) | Задаётся через переменную session_context |
Просмотр через PROCESSLIST
SHOW PROCESSLIST отображает все текущие соединения сеансов и выполняемые в них запросы, включая Query ID и Connection ID.
SHOW PROCESSLIST;
Пример вывода:
+------------------+------+------+---------------------+---------------------+----------+------+---------+------+-------+----------------------------------+------------------+---------------+--------------+
| CurrentConnected | Id | User | Host | LoginTime | Catalog | Db | Command | Time | State | QueryId | Info | FE | CloudCluster |
+------------------+------+------+---------------------+---------------------+----------+------+---------+------+-------+----------------------------------+------------------+---------------+--------------+
| No | 2 | root | 172.20.32.136:54850 | 2025-05-11 10:41:52 | internal | | Query | 6 | OK | 12ccf7f95c1c4d2c-b03fa9c652757c15| select sleep(20) | 172.20.32.152 | NULL |
| Yes | 3 | root | 172.20.32.136:54862 | 2025-05-11 10:41:55 | internal | | Query | 0 | OK | b710ed990d4144ee-8b15bb53002b7710| show processlist | 172.20.32.152 | NULL |
| No | 1 | root | 172.20.32.136:47964 | 2025-05-11 10:41:54 | internal | | Sleep | 11 | EOF | b60daa992bac4fe4-b29466aacce67d27| | 172.20.32.153 | NULL |
+------------------+------+------+---------------------+---------------------+----------+------+---------+------+-------+----------------------------------+------------------+---------------+--------------+
Описание основных полей:
CurrentConnected: значениеYesуказывает на соединение, соответствующее текущему сеансу.Id: Connection ID, уникальный идентификатор соединения.QueryId: Query ID, уникальный идентификатор последнего выполненного или выполняющегося сейчас SQL-запроса.
Поведение по умолчанию: SHOW PROCESSLIST отображает только сеансы на узле FE, к которому установлено текущее соединение, и не включает сеансы других узлов FE. Чтобы просмотреть сеансы на всех узлах FE, задайте следующую переменную перед выполнением запроса:
SET show_all_fe_connection = true;
SHOW PROCESSLIST;
Также можно использовать системную таблицу information_schema, которая по умолчанию отображает сеансы на всех узлах FE и не требует дополнительной настройки:
SELECT * FROM information_schema.processlist;
Идентификация запросов по Trace ID
Эта возможность поддерживается начиная с версий 2.1.11 и 3.0.7.
Trace ID — это пользовательский идентификатор, который вы заранее назначаете запросу. Он позволяет инструменту управления записать уникальный идентификатор запроса ещё до его отправки, чтобы впоследствии запрос можно было в любой момент отменить по Trace ID.
Задайте Trace ID для текущего сеанса следующим образом:
SET session_context = "trace_id:your_trace_id";
your_trace_id: пользовательская строка, которая не должна содержать символ;. Для обеспечения уникальности рекомендуется использовать UUID.- Trace ID — параметр уровня сеанса, который действует только в текущем сеансе. После его задания все последующие запросы в этом сеансе будут связаны с этим Trace ID.
Также его можно задать с помощью Hint в отдельном запросе, не изменяя переменную сеанса:
SELECT /*+SET_VAR(session_context="trace_id:your_trace_id")*/ * FROM table ...;
Выполнение операции KILL
Права доступа: обычные пользователи могут завершать только запросы, которые отправили сами. Пользователи ADMIN могут завершать запросы любого пользователя.
Завершение запроса
KILL QUERY отменяет указанный выполняющийся запрос, не отключая сеанс.
KILL QUERY "query_id" | "trace_id" | connection_id;
Сравнение трёх вариантов:
| Тип параметра | Пример | Область действия |
|---|---|---|
"query_id" | KILL QUERY "d36417cc05ff41ab-9d3afe49be251055"; | Ищет на всех узлах FE и отменяет соответствующий запрос |
"trace_id" | KILL QUERY "your_trace_id"; | Ищет на всех узлах FE и отменяет соответствующий запрос |
connection_id | KILL QUERY 55; | Отменяет только запрос, выполняющийся в указанном соединении на узле FE, к которому установлено текущее соединение |
Примечания:
- Query ID и Trace ID необходимо заключать в кавычки. Connection ID должен быть целым числом больше 0 и указываться без кавычек.
KILL QUERYс указанием Connection ID действует только на узле FE, к которому установлено текущее соединение.
Разрыв соединения
KILL CONNECTION отключает указанный сеанс, а также отменяет запрос, выполняющийся в этом соединении.
KILL [CONNECTION] connection_id;
Ключевое слово CONNECTION можно опустить. Следующие два варианта эквивалентны:
KILL CONNECTION 55;
KILL 55;
Примечание: значения Connection ID на разных узлах FE могут совпадать. Эта операция действует только на узле FE, к которому установлено текущее соединение.
Рекомендуемая практика: управление запросами по Trace ID
В системе управления или на бизнес-платформе рекомендуется использовать Trace ID, чтобы заранее помечать запросы и отменять именно нужный запрос. Порядок действий:
- Перед отправкой запроса создайте уникальный Trace ID (рекомендуется UUID) и привяжите его к запросу.
- Во время выполнения запроса система может в любой момент отправить команду KILL, указав Trace ID.
Привязать Trace ID можно двумя способами:
-
Задать переменную сеанса перед запросом (подходит для работы с одним соединением):
SET session_context = "trace_id:your_trace_id";
SELECT * FROM table ...; -
Встроить Hint в запрос (подходит для повторного использования соединений из пула):
SELECT /*+SET_VAR(session_context="trace_id:your_trace_id")*/ * FROM table ...;
После привязки запрос можно в любой момент отменить следующей командой:
KILL QUERY "your_trace_id";