Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
为什么我的查询在 Amazon Redshift 中被取消?
我在 Amazon Redshift 中的查询被取消,并显示错误消息。
简短描述
出于以下原因,可以在 Amazon Redshift 中取消查询:
- 设置 Amazon Redshift 工作负载管理(WLM)查询监控规则
- 语句超时值
- 中止、取消或终止请求
- 网络问题
- 集群维护升级
- 内部处理错误
- ASSERT 错误
为防止您的查询停止,请完成以下步骤:
- 增加您的超时参数。
- 更新您的 WLM QMR 规则。
- 在维护时段之外安排长时间运行的操作。
解决方法
设置 Amazon Redshift WLM 查询监控规则
创建 WLM 查询监控规则(QMR),为您的队列定义基于指标的性能边界。或者,指定当查询超过 WLM 时间限制时 Amazon Redshift 将采取的操作。例如,创建一条规则来取消运行时间超过 60 秒阈值的查询。
示例 1: 查询监控规则中指定的中止操作
如果由于查询监控规则中指定的中止操作而取消查询,则查询会返回下列错误:
"ERROR: Query (500029) cancelled by WLM abort action of Query Monitoring Rule "testrule"."
要确定查询是否由于“中止”操作而被取消,请运行下列查询:
select * from STL_WLM_RULE_ACTION where action = 'abort';
查询输出列出了由“中止”操作取消的所有查询。如果输出中列出了您的查询 ID,请增加 WLM QMR 参数中的时间限制。
示例 2: 没有可供跳跃查询的可用队列
如果在查询监控规则中指定了“跳跃”操作,则可以跳跃查询。跳跃查询时,WLM 会尝试根据 WLM 队列分配规则将查询路由到下一个匹配队列。如果查询与队列定义不匹配,则该查询将被取消。取消的查询不会被重新分配到默认队列。有关详细信息,请参阅 wlm_json_configuration 参数的属性。
**注意:**您只能在手动 WLM 配置中跳跃查询。
如果跳跃查询,但没有匹配的队列可用,则取消的查询会返回下列错误消息:
"ERROR: Query (500104) canceled on user's request and ran out of wlm queues for restart."
如果您的查询被取消并显示此错误消息,请运行以下查询来检查用户定义的队列:
select * from stl_wlm_query where query=<query-id>;
在您的输出中,service_class 条目 6-13 包含用户定义的队列。例如,service_class 6 可能在 WLM 配置中列出 Queue1,而 service_class 7 可能列出 Queue2。
运行以下查询以获取有关 service_class 到队列映射的更多信息:
select * from stv_wlm_service_class_config where service_class>5;
获取队列映射信息后,从 Amazon Redshift 控制台检查 WLM 配置。验证队列是否与 WLM 配置匹配。只有在有匹配队列可用于用户组或查询组配置时,才能跳跃查询。有关详细信息,请参阅 WLM 查询队列跳跃。
语句超时值
statement_timeout 值是在 Amazon Redshift 终止查询之前查询运行的最长时间。当超过语句超时时,会取消在会话期间提交的查询,并显示以下错误消息:
“错误: 已根据用户的请求取消查询(150)”
要验证查询是否由于语句超时而被取消,请运行下列查询:
select * from SVL_STATEMENTTEXT where text ilike '%set%statement_timeout%to%' and pid in (select pid from STL_QUERY where query = <queryid>);
也可以在集群参数组中设置语句超时。检查您的集群参数组和任何 statement_timeout 配置设置以进一步确认。有关详细信息,请参阅修改参数组。
中止、取消或终止请求
要检查特定查询是否被用户(例如超级用户)停止或取消,请使用您的查询 ID 运行下列查询:
select * from SVL_STATEMENTTEXT where text ilike '%cancel%' and xid in (select xid from STL_QUERY where query = <queryid>); select * from SVL_STATEMENTTEXT where text ilike '%abort%' and xid in (select xid from STL_QUERY where query = <queryid>);
如果查询出现在输出中,则查询已根据用户请求停止或取消。
**注意:**用户只能终止自己的会话。超级用户可以终止所有会话。
当用户取消或终止相应的进程(正在运行查询的位置),也可停止查询。下面是可以取消或终止查询的进程的示例:
当这些命令取消或终止某个进程时,SVL_TERMINATE 中会记录一个条目。要确认查询是否因会话终止而停止,请检查 SVL_TERMINATE 日志。运行以下查询来检查 SVL_TERMINATE 日志:
select * from SVL_TERMINATE where pid=(select pid from STL_QUERY where query=500534);
网络问题
有时,由于潜在的网络问题,查询会被取消。要验证网络问题是否导致您的查询取消,请运行下列查询来检查 STL_CONNECTION_LOG 条目:
select * from STL_CONNECTION_LOG where pid in (select pid from STL_QUERY where query = <query_id>);
STL_CONNECTION_LOG 记录身份验证尝试以及网络连接或断开连接。如果您的查询出现在输出中,则网络连接问题可能导致您的查询取消。
集群维护升级
如果在查询运行时进行定期维护,则查询将终止并回滚,需要重启集群。安排长时间运行的操作(例如大型数据加载或 VACUUM 操作)以避免维护时段。有关详细信息,请参阅在维护时段前后安排时间。
要检查您的 Amazon Redshift 集群是否进行了维护,请在您的 Amazon Redshift 控制台中选择事件选项卡。
内部处理错误
STL_ERROR 表记录了 Amazon Redshift 生成的内部处理错误。STL_ERROR 表不记录 SQL 错误或消息。
要验证您的查询是否因内部错误而取消,请运行下列查询来检查 STL_ERROR 条目:
select * from STL_ERROR where userid=<user id>;
ASSERT 错误
有时,查询会因为 ASSERT 错误而停止。当查询本身存在问题时,可能会发生 ASSERT 错误。如果您在补丁升级后出现 ASSERT 错误,请将 Amazon Redshift 更新到最新的集群版本。然后,检查集群版本历史记录。或者,您可以回滚集群版本。
- 语言
- 中文 (简体)
