KILL QUERY 和 KILL MUTATION 语句。
默认情况下,如果没有匹配到任何内容,语句会直接返回,不会抛出异常。如需在以下情况下抛出异常,请将 kill_throw_if_noop 设置为 true:对于 KILL QUERY,在排除当前 KILL 语句后,其 WHERE 表达式在 system.processes 中没有留下任何符合条件的行;对于 KILL MUTATION,其 WHERE 表达式在 system.mutations 中匹配到零行。
以 ON CLUSTER 方式执行时,即使没有匹配到任何内容也不会抛出异常,因为匹配结果不会跨主机汇总。
KILL QUERY
KILL 查询中 WHERE 子句定义的条件,从 system.processes 表中筛选出来。
示例:
首先,您需要获取未完成查询的列表。以下 SQL 查询会按运行时长从长到短列出这些查询:
单个 ClickHouse 节点上的列表:
system.processes 上 SELECT 授权的用户,仍可通过指定查询 ID 取消自己的查询:
KILL QUERY WHERE query_id = '<id>'。对于既没有该授权也没有 KILL QUERY 权限的用户,如果指定的 ID 不属于其正在运行的查询,
则不会取消任何查询,也不会返回任何行,且不会报错;但如果启用了
kill_throw_if_noop,则会将该空操作作为异常抛出。拥有 KILL QUERY 权限但没有该 SELECT 授权的用户,会因缺少 SELECT 授权而被拒绝。
其他任何 WHERE 条件以及 ON CLUSTER 仍要求具备上述授权。
默认使用的是查询的异步版本 (ASYNC) ,不会等待查询已停止的确认。
同步版本 (SYNC) 会等待所有查询停止,并在每个进程停止时显示相关信息。
响应中包含 kill_status 列,其可能的取值如下:
finished– 查询已成功终止。waiting– 已向查询发送终止信号,正在等待其结束。- 其他值则说明该查询无法被停止的原因。
TEST) 仅检查用户权限,并显示将要停止的查询列表。
KILL MUTATION
存在长时间运行或未完成的变更,通常说明 ClickHouse 服务运行状态不佳。由于变更是异步执行的,它们可能会耗尽系统中的所有可用资源。你可能需要采取以下措施之一:- 暂停所有新的变更、
INSERT和SELECT,并等待变更队列处理完成。 - 或者发送
KILL命令,手动终止其中一部分变更。
KILL 查询的 WHERE 子句指定的过滤条件,从 system.mutations 表中选出。
测试查询 (TEST) 仅检查用户权限,并显示将要停止的变更列表。
示例:
统计未完成变更数量的 count():
单个 ClickHouse 节点上的变更数量:
system.mutations 表中的
is_killed=1 列 (仅 ClickHouse Cloud) 并不一定表示该变更已完全结束。变更有可能长时间处于 is_killed=1 且 is_done=0 的状态。如果另一个运行时间较长的变更阻塞了这个已被终止的变更,就可能出现这种情况。这是正常现象。