为什么我在 Amazon Redshift 中的查询中止了?

上次更新时间:2020 年 10 月 15 日

我在 Amazon Redshift 中的查询已中止,并显示错误消息。为什么我的查询中止?

简短描述

由于以下原因,Amazon Redshift 中的查询可能会中止:

  • 设置 Amazon Redshift 工作负载管理 (WLM) 查询监控规则
  • 语句超时值
  • ABORT、CANCEL 或 TERMINATE 请求
  • 网络问题
  • 集群维护升级
  • 内部处理错误
  • 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 超时行为的详细信息,请参阅 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 将其终止之前可运行的最长时间。当超过语句超时时,将会中止在会话期间提交的查询,并显示以下错误消息:

ERROR:  Query (150) cancelled on user's request

要验证查询是否因语句超时而中止,请运行以下查询:

select * from SVL_STATEMENTTEXT where text ilike '%set%statement_timeout%to%' and pid in (select pid from STL_QUERY where query = <queryid>);

语句超时也可以在集群参数组中设置。检查您的集群参数组以及任何 statement_timeout 配置设置,以进行额外确认。有关集群参数组和 statement_timeout 的更多信息,请参阅修改参数组

ABORT、CANCEL 或 TERMINATE 请求

要检查特定查询是否被用户(如超级用户)中止或取消,请使用查询 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 日志:

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 控制台中选择 Events(事件)选项卡。

内部处理错误

STL_ERROR 表记录了由 Amazon Redshift 生成的内部处理错误。STL_ERROR 表不记录 SQL 错误或消息。

要验证您的查询是否因内部错误而中止,请检查 STL_ERROR 条目:

select * from STL_ERROR where userid=<user id>;

ASSERT 错误

有时,ASSERT 错误也会导致查询中止。当查询本身出现问题时,可能会发生 ASSERT 错误。如果您在修补程序升级后收到 ASSERT 错误,请将 Amazon Redshift 更新到最新的集群版本。然后,检查集群版本历史记录。或者,您可以回滚集群版本。</p


这篇文章对您有帮助吗?


您是否需要账单或技术支持?