程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle數據庫JOB失敗後的重試規律解密

Oracle數據庫JOB失敗後的重試規律解密

編輯:Oracle教程

由於官方文檔上沒有找到相關的說明,所以這裡進行了如下測試,為了找到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存儲過程到最後都會出錯(但是日志表還是可以正常插入進去的)
創建job:
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)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved