应查DBA_SCHEDULER_JOB_LOG或USER_SCHEDULER_JOB_LOG视图获取执行日志,二者独立于任务定义表;DBA权限用户优先用DBA视图,字段更全且覆盖所有用户,需配合JOB_NAME和LOG_DATE过滤,失败详情须关联DBA_SCHEDULER_JOB_RUN_DETAILS视图查询。

查 USER_SCHEDULER_JOB_LOG 或 DBA_SCHEDULER_JOB_LOG
执行日志不保存在 job 本身定义表里,而是独立存在日志视图中。普通用户用 USER_SCHEDULER_JOB_LOG,DBA 权限用户建议直接查 DBA_SCHEDULER_JOB_LOG——它包含所有用户的任务日志,且字段更全。
常见错误是只查 USER_SCHEDULER_JOBS,那里面只有配置信息,没有运行结果。
- 日志默认保留最近 30 天(受
LOGGING_LEVEL和空间策略影响),超期自动清理 - 如果查不到刚跑完的日志,先确认任务是否真执行了:
STATUS字段为SUCCEEDED、FAILED或STOPPED才算有记录;READY或RETRYING不会写入此视图 -
MESSAGE字段只存错误堆栈或DBMS_OUTPUT.PUT_LINE输出(需作业启用LOGGING_LEVEL => DBMS_SCHEDULER.LOGGING_FULL)
过滤关键字段:用 JOB_NAME 和 LOG_DATE 限定范围
日志量大时,不加条件直接 SELECT * 容易卡住或返回无关记录。必须至少带上 JOB_NAME 和时间范围。
例如查名为 JOB_SYNC_DATA 的最近 2 小时日志:
SELECT LOG_DATE, STATUS, ERROR#, MESSAGE, ELAPSED_TIME FROM DBA_SCHEDULER_JOB_LOG WHERE JOB_NAME = 'JOB_SYNC_DATA' AND LOG_DATE >= SYSTIMESTAMP - INTERVAL '2' HOUR ORDER BY LOG_DATE DESC;
-
ERROR#是 Oracle 错误号(如ORA-01403),比纯文本MESSAGE更利于定位根因 -
ELAPSED_TIME单位是+000000000 00:00:00.000000格式,不能直接参与数值比较,需用EXTRACT提取秒数 - 避免用
TO_CHAR(LOG_DATE)做模糊匹配——会强制索引失效
看失败详情要连查 DBA_SCHEDULER_JOB_RUN_DETAILS
DBA_SCHEDULER_JOB_LOG 只记状态和概要,真正报错堆栈、绑定变量值、SQL 执行计划等细节,全在 DBA_SCHEDULER_JOB_RUN_DETAILS 里。它和日志视图通过 LOG_ID 关联。
典型查法:
SELECT d.STATUS, d.ERROR#, d.ADDITIONAL_INFO, d.CPU_USED FROM DBA_SCHEDULER_JOB_LOG l JOIN DBA_SCHEDULER_JOB_RUN_DETAILS d ON l.LOG_ID = d.LOG_ID WHERE l.JOB_NAME = 'JOB_SYNC_DATA' AND l.STATUS = 'FAILED' ORDER BY l.LOG_DATE DESC FETCH FIRST 1 ROW ONLY;
-
ADDITIONAL_INFO是 XML 字段,含完整错误上下文,比如 PL/SQL 异常的行号、被锁对象名、甚至ORA-00060死锁图 - 该视图默认只存成功/失败作业的详细记录,但可通过
DBMS_SCHEDULER.SET_ATTRIBUTE配置为始终记录 - 注意:
DBA_SCHEDULER_JOB_RUN_DETAILS数据量增长快,生产库上慎用无条件SELECT *
为什么有时日志“消失了”?重点检查这三点
不是日志没生成,而是被过滤、截断或权限拦住了。
-
job_queue_processes参数为 0:整个调度引擎停摆,任务根本不会触发,自然无日志。查SELECT VALUE FROM V$PARAMETER WHERE NAME = 'job_queue_processes',非 0 才有效 - 作业未启用:
ENABLED = 'FALSE'的任务不会运行,也不会进日志。查DBA_SCHEDULER_JOBS确认状态 - 日志级别太低:默认只记
FAILED和SUCCEEDED,若想捕获STOPPED或中间DBMS_OUTPUT,得建 job 时显式设LOGGING_LEVEL => DBMS_SCHEDULER.LOGGING_FULL
最易忽略的是日志保留策略——它不依赖数据库归档模式,而是由内部调度器自动清理,且不发告警。线上长期运行的任务,建议定期导出关键日志到外部表归档。


















