跳到主要内容
跳到主要内容

KILL 语句

有两种 KILL 语句:用于终止查询和终止 mutation

KILL QUERY

KILL QUERY [ON CLUSTER cluster]
WHERE <where expression to SELECT FROM system.processes query>
[SYNC|ASYNC|TEST]
[FORMAT format]

尝试强制终止当前正在运行的查询。要终止的查询从 system.processes 表中使用 KILL 查询的 WHERE 子句中定义的条件进行选择。

示例

首先,您需要获取未完成查询的列表。此 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 列,该列可以采用以下值

  1. finished – 查询已成功终止。
  2. waiting – 在发送终止信号后,等待查询结束。
  3. 其他值 ​​解释了为什么查询无法停止。

测试查询 (TEST) 仅检查用户的权限并显示要停止的查询列表。

KILL MUTATION

长时间运行或未完成的 mutation 通常表明 ClickHouse 服务运行不佳。mutation 的异步性质可能导致它们消耗系统上的所有可用资源。您可能需要执行以下操作之一

  • 暂停所有新的 mutation、INSERTSELECT,并允许 mutation 队列完成。
  • 或通过发送 KILL 命令手动终止其中一些 mutation。
KILL MUTATION
WHERE <where expression to SELECT FROM system.mutations query>
[TEST]
[FORMAT format]

尝试取消并删除当前正在执行的 mutation。要取消的 mutation 从 system.mutations 表中使用 KILL 查询的 WHERE 子句指定的过滤器进行选择。

测试查询 (TEST) 仅检查用户的权限并显示要停止的 mutation 列表。

示例

获取未完成 mutation 数量的 count()

来自单个 ClickHouse 节点的 mutation 计数

SELECT count(*)
FROM system.mutations
WHERE is_done = 0;

来自 ClickHouse 副本集群的 mutation 计数

SELECT count(*)
FROM clusterAllReplicas('default', system.mutations)
WHERE is_done = 0;

查询未完成 mutation 的列表

来自单个 ClickHouse 节点的 mutation 列表

SELECT mutation_id, *
FROM system.mutations
WHERE is_done = 0;

来自 ClickHouse 集群的 mutation 列表

SELECT mutation_id, *
FROM clusterAllReplicas('default', system.mutations)
WHERE is_done = 0;

根据需要终止 mutation

-- 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'

当 mutation 卡住且无法完成时,该查询非常有用(例如,如果 mutation 查询中的某些函数在应用于表中包含的数据时抛出异常)。

mutation 已做的更改不会回滚。

注意

is_killed=1 列(仅限 ClickHouse Cloud)在 system.mutations 表中并不一定意味着 mutation 已完全完成。 mutation 可能长时间保持 is_killed=1is_done=0 的状态。如果另一个长时间运行的 mutation 阻止了被终止的 mutation,则可能会发生这种情况。这是一种正常情况。