[20211203]演示job啟動時間改變的情況.txt

lfree發表於2021-12-06

[20211203]演示job啟動時間改變的情況.txt

--//生產系統出現job啟動時間改變的情況,開發還是習慣使用job方式排程後臺任務,實際上應該嘗試使用schedule。
--//透過例子演示出來。

1.環境:
SCOTT@book> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//GRANT EXECUTE ON SYS.DBMS_LOCK TO SCOTT;

2.建立儲存過程:
CREATE OR REPLACE PROCEDURE SCOTT.foo
AS
BEGIN
   NULL;
   dbms_lock.sleep (600);
END;

DECLARE
  X NUMBER;
BEGIN
  begin
    SYS.DBMS_JOB.SUBMIT
      (
        job        => X
       ,what       => 'SCOTT.FOO;'
       ,next_date  => to_date('12/03/2021 17:15:02','mm/dd/yyyy hh24:mi:ss')
       ,interval   => 'SYSDATE+1'
       ,no_parse   => FALSE
    );
  :JobNumber := to_char(X);
  exception
    when others then
    begin
      raise;
    end;
  end;
END;

--//等17:15

SYS@book> select * from DBA_JOBS_RUNNING where job=371;
       SID        JOB   FAILURES LAST_DATE           LAST_SEC         THIS_DATE           THIS_SEC           INSTANCE
---------- ---------- ---------- ------------------- ---------------- ------------------- ---------------- ----------
        30        371                                                 2021-12-03 17:15:02 17:15:02                  0

--//已經啟動。

SYS@book> select sysdate from dual ;
SYSDATE
-------------------
2021-12-03 17:16:08

SYS@book> shutdown abort
ORACLE instance shut down.

SYS@book> startup
ORACLE instance started.
Total System Global Area  643084288 bytes
Fixed Size                  2255872 bytes
Variable Size             205521920 bytes
Database Buffers          427819008 bytes
Redo Buffers                7487488 bytes
Database mounted.
Database opened.

SYS@book> select * from DBA_JOBS_RUNNING where job=371;
       SID        JOB   FAILURES LAST_DATE           LAST_SEC         THIS_DATE           THIS_SEC           INSTANCE
---------- ---------- ---------- ------------------- ---------------- ------------------- ---------------- ----------
       323        371                                                 2021-12-03 17:16:39 17:16:39                  0
--//可以發現啟動資料庫後,job重新執行。開始時間是2021-12-03 17:16:39,查詢job的定義還是:
BEGIN
    SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'SCOTT.FOO;'
     ,next_date => to_date('03/12/2021 17:15:02','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'SYSDATE+1'
     ,no_parse  => FALSE
    );

SYS@book> select * from DBA_JOBS_RUNNING where job=371;
no rows selected

--//執行完成。
--//再次檢視定義:

DECLARE
  X NUMBER;
  user_name varchar2(30);
BEGIN
  select user into user_name from dual;
  execute immediate 'alter session set current_schema = SCOTT';
  BEGIN
    SYS.DBMS_JOB.SUBMIT
    ( job       => X
     ,what      => 'SCOTT.FOO;'
     ,next_date => to_date('04/12/2021 17:16:39','dd/mm/yyyy hh24:mi:ss')
     ,interval  => 'SYSDATE+1'
     ,no_parse  => FALSE
    );
    SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
    execute immediate 'alter session set current_schema = ' || user_name ;
  EXCEPTION
    WHEN OTHERS THEN
      execute immediate 'alter session set current_schema = ' || user_name ;
      RAISE;
  END;
  COMMIT;
END;
/

--//現在下次的啟動實際變成了to_date('04/12/2021 17:16:39','dd/mm/yyyy hh24:mi:ss')。
--//我們生產系統遇到的情況就是這樣,資料庫重啟後,中斷的job啟動,這樣下次啟動job時間變成新的啟動時間。
--//實際上最主要的問題出現在interval  => 'SYSDATE+1'定義上,如果我修改為
--//interval  => 'trunc(SYSDATE+1)+17/24',這樣無論何種情況都是每天啟動都是17點,除了job中斷的情況(比如上面的資料庫異常關
--//閉)。另外注意如果寫成trunc(SYSDATE)+17/24,永遠都不會執行.

--//個人建議job時間設定為固定時間,而不是interval  => 'SYSDATE+1'。我貼一個生產系統類似例子:
> select trunc(scsj),min(scsj) from XXXXX group by trunc(scsj) order by 1;
TRUNC(SCSJ)         MIN(SCSJ)
------------------- -------------------
2021-08-19 00:00:00 2021-08-19 00:00:01
2021-08-20 00:00:00 2021-08-20 00:00:01
2021-08-21 00:00:00 2021-08-21 00:00:03
2021-08-22 00:00:00 2021-08-22 00:00:05
2021-08-23 00:00:00 2021-08-23 00:00:07  --//不知道為什麼這裡變大,我估計啟動時還是03秒。
2021-08-24 00:00:00 2021-08-24 00:00:03
2021-08-25 00:00:00 2021-08-25 00:00:04
2021-08-26 00:00:00 2021-08-26 00:00:06
2021-08-27 00:00:00 2021-08-27 00:00:07
2021-08-28 00:00:00 2021-08-28 00:00:08
2021-08-29 00:00:00 2021-08-29 00:00:08
...
2021-11-29 00:00:00 2021-11-29 00:02:17
2021-11-30 00:00:00 2021-11-30 00:02:18
2021-12-01 00:00:00 2021-12-01 00:02:19
2021-12-02 00:00:00 2021-12-02 00:02:19
2021-12-03 00:00:00 2021-12-03 00:02:19
2021-12-04 00:00:00 2021-12-04 00:02:21
2021-12-05 00:00:00 2021-12-05 00:02:24
2021-12-06 00:00:00 2021-12-06 00:02:26
110 rows selected.

--//該job 8/19啟用,scsj是執行插入的時間,但是你可以發現每天都在往後推遲一點點時間,到現在已經要2:26才開始插入,現在job的
--//next_date => to_date('07/12/2021 00:02:26','dd/mm/yyyy hh24:mi:ss').

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2845862/,如需轉載,請註明出處,否則將追究法律責任。

相關文章