CANCEL
取消当前正在运行的数据库查询。
CANCEL 命令需要正在运行的查询的进程 ID 或会话 ID,并显示一条确认消息来验证查询已取消。
所需的权限
以下是 CANCEL 所需的权限:
取消自己的查询的超级用户
取消用户的查询的超级用户
取消用户的查询并且具有 CANCEL 权限的用户
取消自己的查询的用户
语法
CANCEL process_id [ 'message' ]
参数
- process_id
-
要取消在 Amazon Redshift 集群中运行的查询,请使用 STV_RECENTS 中与要取消的查询对应的
pid
(进程 ID)。要取消在 Amazon Redshift Serverless 工作组中运行的查询,请使用 SYS_QUERY_HISTORY 中与要取消的查询对应的
session_id
。 - '消息'
-
一条可选的确认消息,该消息在查询取消操作完成时显示。如果您不指定消息,Amazon Redshift 将显示默认的确认消息。您必须将消息放在单引号内。
使用说明
您不能通过指定查询 ID 来取消查询;您必须指定查询的进程 ID(PID)或会话 ID。您只能取消当前由您的用户运行的查询。超级用户可以取消所有查询。
如果多个会话中的查询在同一个表上保留锁定,则可以使用 PG_TERMINATE_BACKEND 函数终止其中一个会话。进行此操作会强制使已终止会话中的任意当前正在运行的查询释放所有死锁并回滚事务。查询 STV_LOCKS 系统表可查看当前保留的锁定。
在特定的内部事件之后,Amazon Redshift 可能会重新启动一个活动会话并分配新的 PID。如果 PID 已发生更改,您可能会收到以下错误消息。
Session <PID> does not exist. The session PID might have changed. Check the stl_restarted_sessions system table for details.
要查找新的 PID,请查询 STL_RESTARTED_SESSIONS 系统表并针对 oldpid
列进行筛选。
select oldpid, newpid from stl_restarted_sessions where oldpid = 1234;
示例
要取消 Amazon Redshift 集群中当前正在运行的查询,请先检索要取消的查询的进程 ID。要确定所有当前正在运行的查询的处理 ID,请键入以下命令:
select pid, starttime, duration, trim(user_name) as user, trim (query) as querytxt from stv_recents where status = 'Running'; pid | starttime | duration | user | querytxt -----+----------------------------+----------+----------+----------------- 802 | 2008-10-14 09:19:03.550885 | 132 | dwuser | select venuename from venue where venuestate='FL', where venuecity not in ('Miami' , 'Orlando'); 834 | 2008-10-14 08:33:49.473585 | 1250414 | dwuser | select * from listing; 964 | 2008-10-14 08:30:43.290527 | 326179 | dwuser | select sellerid from sales where qtysold in (8, 10);
检查查询文本,确定哪个进程 ID (PID) 对应于您要取消的查询。
键入以下命令以使用 PID 802 来取消该查询:
cancel 802;
运行查询的会话会显示如下消息:
ERROR: Query (168) cancelled on user's request
其中 168
是查询 ID (而不是用于取消查询的进程 ID)。
或者,您可以指定显示一条自定义消息,而不是默认消息。要指定自定义消息,请使用单引号将消息包含在 CANCEL 命令的结尾:
cancel 802 'Long-running query';
运行查询的会话会显示如下消息:
ERROR: Long-running query