由於官方文檔上沒有找到相關的說明,所以這裡進行了如下測試,為了找到oracle數據庫中 job 失敗後重試時間的規律。
數據庫版本:11.2.0.3
測試說明:這裡創建了一個日志表以及一個運行時必定出錯的procedure,用於job的運行。這裡只要記錄下每次job執行時視圖user_jobs 中的 next_date就可以推斷出job 執行失敗後的重試規律。
為了測試job的重試規律我做了如下工作
日志表以及序列:
create table job_exec_logs (id number ,current_date date , next_date date ,failures number ,broken varchar2( 2)) ; create sequence seq_job_exec_logs_id ; 測試procedure
create or replace procedure pro_my_test is begin insert into job_exec_logs select seq_job_exec_logs_id.nextval , sysdate , next_date , failures , broken from user_jobs ; commit ; execute immediate 'select * from ddddsfs' ; end ;其中ddddsfs表示不存在的,也就是說只要運行pro_my_test存儲過程到最後都會出錯(但是日志表還是可以正常插入進去的)
var job number ; begin sys.dbms_job.submit(job => :job, what => 'pro_my_test ;', next_date => sysdate, interval => 'sysdate+5' ); commit; end; / 其實整個測試過程沒什麼可說的,讓job自動運行即可,但是需要等待job下次重試時間。 最後測試的結果:
dexter@REPO>select trunc((next_date-lag(next_date,1) over (order by 4))*24*60) from ( 2 select * from job_exec_logs 3 union all 4 select 11111, sysdate , next_date ,failures , broken from user_jobs 5 order by 4 nulls first) ; TRUNC((NEXT_DATE-LAG(NEXT_DATE,1)OVER(ORDER BY 4))*24*60) ------------------------------------------------------- 2 4 8 15 32 64 128 256 512 1024 1440 1440 已選擇13行。 如上結果以及筆者的其他測試可以判斷出: 1、每次重試時間都是遞增的,第一次2分鐘,4分鐘,8分鐘,16分鐘 ... 依此類推。 2、當超過1440分鐘,也就是24小時的時候,固定的重試時間為1天。 3、筆者還經過其他實驗得知,超過16次重試後,job 就會被標記為broken ,next_date 為4000-1-1,也就是不再進行job重試。 4、oracle數據庫重試的時間到達設定的下次執行時間後,以設定的job執行時間為准。 想要了解更多,可以看下metalink Broken Jobs and the Job Queue (文檔ID 103349.1)