查找计划丢失/跳过/错过的计划

时间:2013-06-12 06:20:38

标签: sql oracle oracle10g oracle-apps oracleapplications

我有大约350个并发程序,它们在Oracle中以不同的计划运行,从一周一次到每分钟一次。在350个程序中,很少有程序具有多个具有不同参数的计划。

每周都有一次维护,在此期间,并发经理将被撤销,恕不另行通知。无法忍受。但是那段时间运行的程序会出错,后续的计划也会丢失。还有许多其他方式,之后程序的时间表丢失。大多数情况下这些都没有被注意到很长一段时间(有时甚至几个月),这会导致问题。无论如何要查询其计划丢失/跳过/错过的程序?

1 个答案:

答案 0 :(得分: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

如果没有再次运行,任何至少有两次运行的历史作业都应该被选中。您可能需要稍微调整一下以允许工作时间的容差。