任务故障排除

本节介绍对未按预期运行的任务进行故障排除的有条不紊的方法。

本主题内容:

任务未运行

第 1 步:验证任务是否未运行

查询 TASK_HISTORY 表函数以验证任务未运行。任务可能成功运行,但任务定义中的 SQL 语句失败。特别要注意计划和完成的时间,以及任何错误代码和消息。

如果任务有前置任务(在 任务图 中),请验证前置任务是否成功完成。

第 2 步:验证任务是否已恢复

验证任务(或任务图中的每项任务)的状态是否为 RESUMED(使用 DESCRIBE TASKSHOW 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>;
Copy

其中 <task_name> 是正在调整其超时限制的任务的名称。如果语句未返回任何记录,则该任务当前具有默认的 3600000 毫秒(60 分钟)超时。

请注意,如果存在查询并行化问题,则增加仓库大小或增加超时限制都无济于事。考虑寻找替代方法来重写任务运行的 SQL 语句。

语言: 中文