我有大约 350 个并发程序,它们在 Oracle 中以不同的时间表运行,从每周一次到每分钟一次不等。在这 350 个节目中,很少有节目有多个不同参数的时间表。
每周进行一次维护,在此期间并发管理器会被关闭,恕不另行通知。对此无能为力。但是在此期间运行的程序出错了,随后的时间表也丢失了。还有许多其他方式会丢失节目时间表。大多数情况下,很长一段时间(有时甚至几个月)都没有注意到这些,这会导致问题。无论如何要查询日程丢失/跳过/错过的节目吗?
我有大约 350 个并发程序,它们在 Oracle 中以不同的时间表运行,从每周一次到每分钟一次不等。在这 350 个节目中,很少有节目有多个不同参数的时间表。
每周进行一次维护,在此期间并发管理器会被关闭,恕不另行通知。对此无能为力。但是在此期间运行的程序出错了,随后的时间表也丢失了。还有许多其他方式会丢失节目时间表。大多数情况下,很长一段时间(有时甚至几个月)都没有注意到这些,这会导致问题。无论如何要查询日程丢失/跳过/错过的节目吗?
假设您有日志记录,则运行的作业的详细信息将在 USER_SCHEDULER_JOB_RUN_DETAILS
因此,您需要确定其中应该包含哪些数据,但不是。
您可能能够找到 SYSDATE 与上次运行日期之间的差异大于历史作业运行之间的平均差异的作业。我们可以使用LAG解析函数来判断同一个job的两行之间的时间差,然后取平均值,然后把这个差加上job最后一次运行的时间,看看是否超过了时间间隔。
我不使用调度程序,因此没有任何数据来测试它,但它原则上适用于我拥有的类似表:
SELECT job_name, last_run, avg_interval, last_run + avg_interval as expected_runtime
FROM (
SELECT job_name, max(actual_start_date) as last_run, avg(difference) as avg_interval
FROM (
SELECT job_name, actual_start_date,
to_date(actual_start_date) - lag(to_date(actual_start_date))
over (partition by job_name order by log_date) as difference
FROM user_scheduler_job_run_details
)
GROUP BY job_name
)
WHERE last_run + avg_interval < sysdate
ORDER BY expected_runtime desc
任何至少有两次运行的历史作业如果没有再次运行,则应该被拾取。您可能需要稍微调整一下以允许工作时间的公差。