为什么我在 Amazon Redshift 中的查询中止了?
我在 Amazon Redshift 中的查询已中止,并显示错误消息。为什么我的查询中止?
简短描述
由于以下原因,Amazon Redshift 中的查询可能会中止:
- 设置 Amazon Redshift 工作负载管理 (WLM) 查询监控规则
- 语句超时值
- ABORT、CANCEL 或 TERMINATE 请求
- 网络问题
- 集群维护升级
- 内部处理错误
- 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 超时行为的详细信息,请参阅 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 更新到最新的集群版本。然后,检查集群版本历史记录。或者,您可以回滚集群版本。

相关内容
- 已提问 6 个月前lg...
- 已提问 4 个月前lg...
- 已提问 4 天前lg...
- 已提问 22 天前lg...
- AWS 官方已更新 7 个月前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前