任务故障排除¶
本节介绍对未按预期运行的任务进行故障排除的有条不紊的方法。
本主题内容:
任务未运行¶
第 1 步:验证任务是否未运行¶
查询 TASK_HISTORY 表函数以验证任务未运行。任务可能成功运行,但任务定义中的 SQL 语句失败。特别要注意计划和完成的时间,以及任何错误代码和消息。
如果任务有前置任务(在 任务图 中),请验证前置任务是否成功完成。
第 2 步:验证任务是否已恢复¶
验证任务(或任务图中的每项任务)的状态是否为 RESUMED(使用 DESCRIBE TASK 或 SHOW TASKS)。
要恢复单个任务,请执行 ALTER TASK ...RESUME。要以递归方式启用与根任务关联的所有相关任务,请查询 SYSTEM$TASK_DEPENDENTS_ENABLE 函数,而不是单独启用每个任务。
在查看任务详细信息时,如果任务有计划,还要检查 cron 表达式。验证是否至少经过了一次计划时间。
第 3 步:验证授予任务所有者的权限¶
验证任务所有者(即拥有任务 OWNERSHIP 权限的角色)是否拥有运行任务所需的以下权限:
对象 |
权限 |
备注 |
---|---|---|
账户 |
EXECUTE TASK |
运行角色拥有的任何任务所需要的。撤销某个角色的 EXECUTE TASK 权限会阻止所有后续任务在该角色下运行。 |
数据库 |
USAGE |
|
架构 |
USAGE |
|
任务 |
OWNERSHIP |
|
仓库 |
USAGE |
使用 SHOW GRANTS TO ROLE role_name
验证授予角色的权限。
第 4 步:验证条件¶
如果任务包含带有 SYSTEM$STREAM_HAS_DATA 条件的 WHEN 子句,请验证指定的流在上次计划运行任务时是否包含变更数据获取 (CDC) 记录。可以使用 AT | BEFORE 子句查询流的历史数据。
任务超时或超出计划窗口¶
单次运行任务的默认限制为 60 分钟。实施此限制是为了防止非终止任务。查询 TASK_HISTORY 表函数。如果任务被取消或超出了为任务计划的窗口,则原因通常是仓库规模过小。查看仓库大小,并考虑增大规模以适应计划窗口或一小时限制。
或者,考虑通过执行 ALTER TASK ...SET USER_TASK_TIMEOUT_MS = <num> 来增加任务的超时限制。要确定是否已为特定任务设置了 USER_TASK_TIMEOUT_MS 参数,请执行以下语句:
SHOW PARAMETERS LIKE 'USER_TASK_TIMEOUT_MS' IN TASK <task_name>;
其中 <task_name>
是正在调整其超时限制的任务的名称。如果语句未返回任何记录,则该任务当前具有默认的 3600000
毫秒(60 分钟)超时。
请注意,如果存在查询并行化问题,则增加仓库大小或增加超时限制都无济于事。考虑寻找替代方法来重写任务运行的 SQL 语句。