使用BethuneX做巡检,连续报如下错误:
--错误 Thu Oct 29 14:36:04 2020 Errors in file /u01/app/oracle/diag/rdbms/mtws/mtws/trace/mtws_j000_33913.trc: ORA-12012: 自动执行作业 3 出错 ORA-12005: 不能安排过去时间的自动刷新 Errors in file /u01/app/oracle/diag/rdbms/mtws/mtws/trace/mtws_j000_33913.trc: ORA-12012: error on auto execute of job 25 ORA-12005: may not schedule automatic refresh for times in the past
首先从报错判断跟JOB相关,排查过程:
1、首先使用oerr ora 12012 ,oerr ora 12005命令查看
分析:INTERVAL的值+JOB开始运行的时间,算出下次执行时间在当前时间之前,所以报错ORA-12005: 不能安排过去时间的自动刷新。要想理解这个得知道JOB内部的工作。
2、度娘查询,通过https://blog.csdn.net/stevendbaguo/article/details/77770955 确定JOB的工作流程
JOB的工作流程:
1.JOB在运行结束之后才会更新next_date,但是计算的方法是JOB刚开始的时间加上interval设定的间隔。
2.如果在执行完JOB之后的时间比按照this_date+interval计算出的时间更晚一些,那么next_date就更新为当前时间,也就是几乎会立刻再重新执行JOB。
3.如果一个job执行failure后,oracle会尝试重新执行,若16次尝试后还是failure,则oracle会将这个job的broken设为true,即停掉这个job。
当job失败后,系统会在1分钟后重新运行这个JOB,如果还是失败,就在和第1次失败间隔2分钟的时候继续运行这个JOB,如果还是失败,就在和 第2次失败相隔4分钟后运行这个JOB,直到 失败间隔时间≥interval(JOB正常工作的时间设置参数)后,系统检测的时间间隔就为interval.直到第16次失败就会将这个job置为 broken。
所以原因也许是interval设置的不合理,也许是JOB执行的时间太长。
3、到dba_jobs表中查询报警JOB情况
select job,log_user,schema_user,what,LAST_DATE,LAST_SEC,THIS_DATE,THIS_SEC,NEXT_DATE,NEXT_SEC,INTERVAL from dba_jobs where job in (34,25);
select job,NEXT_DATE,what,INTERVAL from dba_jobs where job in (3,25);
发现INTERVAL中的值异常,参考http://blog.itpub.net/29346172/viewspace-2199878/ 发现应该为类似 TRUNC(SYSDATE +1) + (3*60+10)/(24*60) 这样的格式,判断上图中特殊字符应该为括号。
告知客户考虑重建JOB修复。
4、其他
该问题并未完全吃透,应该掌握JOB的创建过程、方式,JOB相关表的功能作用,INTERVAL设置等。
参考:
1、定位错误:https://blog.csdn.net/stevendbaguo/article/details/77770955
2、dba_jobs字段说明:https://www.cnblogs.com/uzipi/p/5590161.html
3、执行间隔interval运行频率设置:https://blog.csdn.net/qq_30270931/article/details/81865875