为什么我的查询在 Amazon Redshift 中被取消?

2 分钟阅读
0

我在 Amazon Redshift 中的查询被取消,并显示错误消息。

简短描述

出于以下原因,可以在 Amazon Redshift 中取消查询:

  • 设置 Amazon Redshift 工作负载管理(WLM)查询监控规则
  • 语句超时值
  • 中止、取消或终止请求
  • 网络问题
  • 集群维护升级
  • 内部处理错误
  • ASSERT 错误

为防止您的查询停止,请完成以下步骤:

解决方法

设置 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 更新到最新的集群版本。然后,检查集群版本历史记录。或者,您可以回滚集群版本

AWS 官方
AWS 官方已更新 10 个月前