簡體   English   中英

Oracle dbms_job 在 5 秒內執行具有不同延遲的作業。 如何讓它以指定的時間間隔無延遲地運行作業?

[英]Oracle dbms_job executes jobs with different delays in 5 secs. How make it to run job at specified interval without delays?

我通過 DBMS_JOB package 創建了簡單的工作(在 oracle 12.2 和 11.2 下測試)

begin
  sys.dbms_job.submit(job => :job,
                      what => 'null;',
                      next_date => to_date('19-06-2020 22:26:00', 'dd-mm-yyyy hh24:mi:ss'),
                      interval => 'trunc(sysdate,''MI'')+1/24/60');
  commit;
end;

它應該每分鍾運行一次(沒有秒延遲)

然后我用

select last_date, last_sec, next_date, what,interval from all_jobs where job=:job

為了監控上次開始時間和下次開始時間,我每分鍾抓起 output 並將其放在下表中。 以下是作業運行的結果:

| LAST_DATE           | LAST_SEC | NEXT_DATE           | WHAT  | INTERVAL                    |
| 2020-06-19 22:33:02 | 22:33:02 | 2020-06-19 22:34:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:34:07 | 22:34:07 | 2020-06-19 22:35:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:35:13 | 22:35:13 | 2020-06-19 22:36:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:36:18 | 22:36:18 | 2020-06-19 22:37:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:37:24 | 22:37:24 | 2020-06-19 22:38:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:38:30 | 22:38:30 | 2020-06-19 22:39:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:39:05 | 22:39:05 | 2020-06-19 22:40:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:40:10 | 22:40:10 | 2020-06-19 22:41:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:41:16 | 22:41:16 | 2020-06-19 22:42:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:42:21 | 22:42:21 | 2020-06-19 22:43:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:43:27 | 22:43:27 | 2020-06-19 22:44:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:44:02 | 22:44:02 | 2020-06-19 22:45:00 | null; | trunc(sysdate,'MI')+1/24/60 |
| 2020-06-19 22:45:08 | 22:45:08 | 2020-06-19 22:46:00 | null; | trunc(sysdate,'MI')+1/24/60 |

嗯... NEXT_DATE顯示正確的時間,但LAST_DATE / LAST_SEC顯示有延遲的時間。 開始作業時間的延遲不斷從零增長到 30 秒:2、7、13、18、24、30。然后又從零開始:5、10、16、21、27,然后又是 2、8、...等等

為什么它每次都不完全在:00 秒開始並且不斷增長? 如何在所需時間准確啟動它?

通常,我不能將 DBMS_SCHEDULER 與日歷語法一起使用。 我需要根據我的復雜算法用 pl/sql function 精確計算下一個工作時間。

另外:如果您將what參數設置為以下內容,則可以看到啟動作業的相同延遲:

insert into my_table(last_date) values(sysdate);

DBMS_JOB 一直受到調度蠕變的影響,因為間隔是從作業結束時開始計算的,所以間隔是您指定的時間加上運行前一個作業執行所花費的時間 如果您需要如此精確的調度,那么您需要使用 Oracle 調度程序 (DBMS_SCHEDULER)。 它將允許您將執行安排到第二個,而不會蠕動。 這里有一些資源可以幫助您更好地熟悉它:

以下是創建每分鍾運行一次的作業的 DDL 示例:

BEGIN
  -- Job defined entirely by the CREATE JOB procedure.
  DBMS_SCHEDULER.create_job (
    job_name        => 'test_full_job_definition',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN DBMS_STATS.gather_schema_stats(''SCOTT''); END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=minutely; bysecond=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Job defined entirely by the CREATE JOB procedure.');
END;
/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM