2013-06-12 50 views
2

我有大约350个并发程序在Oracle中以不同的时间表运行,从一周一次到每分钟一次。在350个节目中,很少节目有不止一个具有不同参数的节目。查找时间表丢失/跳过/错过的程序

有一个每周维护,在此期间并发经理被关闭,恕不另行通知。无法帮助。但那段时间内正在运行的程序错误了,随后的时间表也丢失了。除此之外,还有许多其他方式会导致程序的时间表丢失。大多数情况下,这些问题很长一段时间都没有被发现(有时甚至是几个月),这会导致问题。无论如何查询计划丢失/跳过/错过的节目吗?

回答

0

假设你已经登录的历史作业的细节问题将在USER_SCHEDULER_JOB_RUN_DETAILS

所以,你需要制定出数据应该在那里的东西,但不是。

您可能能够找到SYSDATE和上次运行日期之间的差异大于历史作业运行之间的平均差异的作业。我们可以使用LAG分析函数来确定同一作业的两行之间的时间差,然后对其进行平均,然后将差异添加到上次作业运行时查看是否超出时间间隔。

我不使用的调度,因此不具有任何数据来测试这一点,但在原则上可与类似的表,我也有:

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 

这在任何历史工作如果它们没有再次运行,至少应运行两次运行。您可能需要稍微调整一下以允许在工作时间中的公差。