KILL 语句
有两种 kill 语句:用于杀死查询和杀死变动
KILL QUERY
KILL QUERY [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.processes query>
[SYNC|ASYNC|TEST]
[FORMAT format]
尝试强制终止当前正在运行的查询。要终止的查询是使用 KILL
查询的 WHERE
子句中定义的条件从 system.processes 表中选择的。
示例
首先,您需要获取未完成的查询列表。此 SQL 查询会根据运行时间最长的查询提供它们
从单个 ClickHouse 节点列出
SELECT
initial_query_id,
query_id,
formatReadableTimeDelta(elapsed) AS time_delta,
query,
*
FROM system.processes
WHERE query ILIKE 'SELECT%'
ORDER BY time_delta DESC;
从 ClickHouse 集群列出
SELECT
initial_query_id,
query_id,
formatReadableTimeDelta(elapsed) AS time_delta,
query,
*
FROM clusterAllReplicas(default, system.processes)
WHERE query ILIKE 'SELECT%'
ORDER BY time_delta DESC;
杀死查询
-- Forcibly terminates all queries with the specified query_id:
KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90'
-- Synchronously terminates all queries run by 'username':
KILL QUERY WHERE user='username' SYNC
如果您在 ClickHouse Cloud 或自托管集群中杀死查询,请务必使用 ON CLUSTER [cluster-name]
选项,以确保在所有副本上杀死查询
只读用户只能停止自己的查询。
默认情况下,使用查询的异步版本 (ASYNC
),它不会等待查询停止的确认。
同步版本 (SYNC
) 会等待所有查询停止,并在每个进程停止时显示其信息。响应包含 kill_status
列,它可以取以下值
finished
– 查询已成功终止。waiting
– 等待查询在发送终止信号后结束。- 其他值解释了为什么无法停止查询。
测试查询 (TEST
) 只检查用户的权限并显示要停止的查询列表。
KILL MUTATION
长时间运行或未完成的变动通常表明 ClickHouse 服务运行不正常。变动的异步性质会导致它们消耗系统上的所有可用资源。您可能需要:
- 暂停所有新的变动、
INSERT
和SELECT
,并允许变动队列完成。 - 或者通过发送
KILL
命令手动杀死其中一些变动。
KILL MUTATION [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.mutations query>
[TEST]
[FORMAT format]
尝试取消并删除 变动,这些变动当前正在执行。要取消的变动是从 system.mutations
表中选择的,使用 KILL
查询的 WHERE
子句指定的筛选器。
测试查询 (TEST
) 只检查用户的权限并显示要停止的变动列表。
示例
获取未完成变动数量的 count()
从单个 ClickHouse 节点获取变动数量
SELECT count(*)
FROM system.mutations
WHERE is_done = 0;
从 ClickHouse 副本集群获取变动数量
SELECT count(*)
FROM clusterAllReplicas('default', system.mutations)
WHERE is_done = 0;
查询未完成变动列表
从单个 ClickHouse 节点列出变动
SELECT mutation_id, *
FROM system.mutations
WHERE is_done = 0;
从 ClickHouse 集群列出变动
SELECT mutation_id, *
FROM clusterAllReplicas('default', system.mutations)
WHERE is_done = 0;
根据需要杀死变动
-- Cancel and remove all mutations of the single table:
KILL MUTATION WHERE database = 'default' AND table = 'table'
-- Cancel the specific mutation:
KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt'
ON CLUSTER [cluster-name]
选项,以确保在所有副本上杀死变动:当变动卡住且无法完成时,此查询很有用(例如,如果变动查询中的某些函数在应用于表中包含的数据时抛出异常)。
变动已经做出的更改不会回滚。