Oracle定時器JOB執行時間不斷推後的問題研究

2021-06-07 08:45:01 字數 2675 閱讀 3335

工作中我們經常用oracle的job執行一些定時任務,實踐中我們發現,設定執行時間和間隔後,每次執行的時間都會有點延遲,經過一段時間後,推遲累計的效應就相當明顯,必須要重新調整時間才能滿足要求,為什麼會出現這種現象呢?經過研究,我們發現了問題所在。下面舉例說明這個問題。

建立乙個job,內容為插入系統時間到資料庫,執行間隔為1分鐘,即inteval是sysdate+1/(24*60),我們發現記錄的時間是不斷推遲的,即:

2012-06-27 12:32:08

2012-06-27 12:33:13

2012-06-27 12:34:18

2012-06-27 12:35:23

2012-06-27 12:36:28

2012-06-27 12:37:33

2012-06-27 12:38:38

檢查job的執行時間,發現也是不斷推後的,發生這種現象的原因是什麼呢?

原因是計算下次執行時間用的間隔是sysdate+1/(24*60),可能是job的啟動要時間或者是掃瞄精度的原因,計算下次執行時間時用的標準時間已經不是啟動job的時間,而是推遲幾秒,所以下次執行時間會不斷推遲,找到問題所在,解決起來也就簡單了,那就是選乙個標準時間計算下次執行時間。如果每分鐘執行一次,我們可以將當前時間擷取到分鐘作為標準時間,

即inteval 取trunc(sysdate,'mi')+1/(24*60),這樣就不會有累積效應了。看執行結果:

2012-06-27 12:42:03

2012-06-27 12:43:03

2012-06-27 12:44:03

2012-06-27 12:45:03

2012-06-27 12:46:03

2012-06-27 12:47:03

2012-06-27 12:48:03

對於不同的間隔,時間擷取可以採用不同的精度,比如每天執行一次,可以用trunc(sysdate,'dd')將時間擷取到00:00:00,如每天2:00執行,inteval 取trunc(sysdate,'dd')+2/24+1或者trunc(sysdate)+2/24+1就可以了。

1、job在執行結束之後才會更新next_date,但是計算的方法是job剛開始的時間加上interval設定的間隔。

2、如果interval的時長短於job執行的時間,作業仍然會繼續進行,只是執行間隔變為了job真實執行的時長。

3、用於計算next_date的job啟動時間總是比設定的時間推遲幾秒,原因可能是job的啟動時間或者是掃瞄精度。

4、如果job因為某些原因延遲執行了一次,就會導致下一次的執行時間也同樣順延了,如本文所描述的延遲累積。因此用正確的時間間隔就很重要。比如,我們要job在每天的凌晨2:30執行而不管上次執行到底是幾點,設定interval為trunc(sysdate)+2.5/24+1就可以了。

1、每分鐘執行

trunc(sysdate,'mi')+1/(24*60)

2、每天定時執行

例如:每天凌晨0點執行

trunc(sysdate+1)

每天凌晨1點執行

trunc(sysdate+1)+1/24

每天早上8點30分執行

trunc(sysdate+1)+(8*60+30)/(24*60)

3、每週定時執行

例如:每週一凌晨2點執行

trunc(next_day(sysdate,1))+2/24

trunc(next_day(sysdate,'星期一'))+2/24

每週二中午12點執行

trunc(next_day(sysdate,2))+12/24

trunc(next_day(sysdate,'星期二'))+12/24

4、每月定時執行

例如:每月1日凌晨0點執行

trunc(last_day(sysdate)+1)

每月1日凌晨1點執行

trunc(last_day(sysdate)+1)+1/24

5、每季度定時執行

每季度的第一天凌晨0點執行

trunc(add_months(sysdate,3),'q')

每季度的第一天凌晨2點執行

trunc(add_months(sysdate,3),'q')+2/24

每季度的最後一天的晚上11點執行

trunc(add_months(sysdate+ 2/24,3),'q')-1/24

6、每半年定時執行

例如:每年7月1日和1月1日凌晨1點執行

add_months(trunc(sysdate,'yyyy'),6)+1/24

7、每年定時執行

例如:每年1月1日凌晨2點執行

add_months(trunc(sysdate,'yyyy'),12)+2/24

oracle的job定時器

對於dba來說,資料庫job再熟悉不過了,因為經常要資料庫定時的自動執行一些指令碼,或做資料庫備份,或做資料的提煉,或做資料庫的效能優化,包括重建索引等等的工作。但是,oracle定時器job時間的處理上,千變萬化,今天我把比較常用寫法彙總如下 oracle定時任務有sys.dbms job包完成 ...

Oracle定時器(Job)彙總

對於 dba來說,資料庫 job再熟悉不過了,因為經常要資料庫定時的自動執行一些指令碼,或做資料庫備份,或做資料的提煉,或做資料庫的效能優化,包括重建索引等等的工作。但是,oracle 定時器job 時間的處理上,千變萬化,今天我把比較常用寫法彙總如下 job的引數一一說明一下 引數是由 submi...

自動執行oracle儲存過程 job定時器

1.建立乙個表,為了能清楚看到定時器的運 況我們建立乙個帶有日期欄位的表 create table job table run time date 2.建立儲存過程 create or replace procedure job proc is begin insert into job table...