今天遇到一個情況,某一台主機的時間早了20分鐘,

由於想實做 Database Link , 所以想把兩台主機的時間調近一點,

由於這台主機是HP的,改了時間之後,卻發現 date 的語法有些不同,

而系統上用的時區竟然不是台灣的時區 GMT+8 ,改了之後發現,時間快了8小時,

原本不以為意,想說立刻把輸入的時間也早八小時,這樣就負負得正啦(誤, 其實是我不會調時區哩)

沒想到後來竟發現,連該主機上的JOB排程也出問題了,

有些排程在我變更時間的那兩分鐘內,有執行過,這下麻煩了,

變成這幾個排程的[下次執行時間]跑到下午去了(因為也快了八小時),

逼不得已上網找了一下Oracle 的JOB排程的語法,想要來個強制啟動 ^O^

發現這個網站裡有介紹....

找要在 ALL_JOBS 找出你的 JOB的號碼就可以了

 

RUN procedure

This procedure runs job JOB now. It runs it even if it is broken.

Running the job recomputes next_date. See view user_jobs.

Syntax

DBMS_JOB.RUN ( 
job IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE);

Parameters

Table 16-10 Run Procedure Parameters
Parameter  Description 
job
 

Number of the job being run.  

force
 

If this is TRUE, then instance affinity is irrelevant for running jobs in the foreground process. If this is FALSE, then the job can be run in the foreground only in the specified instance.  

Example

EXECUTE DBMS_JOB.RUN(14144);

 


 

其他的用法如下

Summary of Subprograms

Table 16-1 DBMS_JOB Package Subprograms
Subprogram  Description 
SUBMIT procedure
 

Submits a new job to the job queue.  

REMOVE procedure
 

Removes specified job from the job queue.  

CHANGE procedure
 

Alters any of the user-definable parameters associated with a job.  

WHAT procedure
 

Alters the job description for a specified job.  

NEXT_DATE procedure
 

Alters the next execution time for a specified job.  

INSTANCE procedure
 

Assigns a job to be run by a instance.  

INTERVAL procedure
 

Alters the interval between executions for a specified job.  

BROKEN procedure
 

Disables job execution.  

RUN procedure
 

Forces a specified job to run.  

USER_EXPORT procedure
 

Recreates a given job for export.  

USER_EXPORT procedure
 

Recreates a given job for export with instance affinity.  

 

    下面是常有的設置Interval的方法:
    每天固定時間運行,比如早上8:10分鐘:Trunc(Sysdate+1) + 8/24

    每天:trunc(sysdate+1)
    每週:trunc(sysdate+7)
    每月:trunc(sysdate+30)
    每個星期日:next_day(trunc(sysdate),'SUNDAY')    
    每天6點:trunc(sysdate+1)+6/24      
    每半個小時:sysdate+30/1440



FROM 網路文章

第三步:異常情況處理

    JOB不能運行情況處理

    1.先來瞭解一下JOB的參數說明:與job相關的參數一個是job_queue_processes,這個是運行JOB時候所起的進程數,
    當然系統裡面 JOB大於這個數值後,就會有排隊等候的,最小值是0,表示不運行JOB,
    最大值是36,在OS上對應的進程時SNPn,9i以後OS上管理JOB的進程叫CJQn.可以使用下面這個SQL確定目前有幾個SNP/CJQ在運行。

    select * from v$bgprocess,這個paddr不為空的snp/cjq進程就是目前空閒的進程,有的表示正在工作的進程。

    另外一個是job_queue_interval,範圍在1——3600之間,單位是秒,這個是喚醒JOB的process,因為每次snp運行完他就休息了,
    需要定期喚醒他,這個值不能太小,太小會影響數據庫的性能。

    2.診斷:先確定上面這兩個參數設置是否正確,特別是第一個參數,設置為0了,所有JOB就不會跑,確認無誤後,我們繼續向下。

    3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job運行成功的結束時間,
    next_date是根據設置的頻率計算的下次執行時間,根據這個信息就可以判斷JOB上次是否正常,還可以判斷下次的時間對不對,SQL如下:

    select * from dba_jobs

    有時候我們發現他的next_date是4000年1月1日,說明job要不就是在running,要不就是狀態是break(broken=Y),
    如果發現JOB的broken值為Y,找用戶瞭解一下,確定該JOB是否可以broken,如果不能broken,那就把broken值修改成N,
    修改再使用上面的SQL察看就發現他的last_date已經變了,JOB即可正常運行,修改broken狀態的SQL如下:

    declare
    BEGIN   
        DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
    END;

    4.使用下面的SQL查詢是否JOB還在Running

    select * from dba_jobs_running

    如果發現JOB已經Run了很久了還沒有結束,就要查原因了。一般的JOB running時會鎖定相關的相關的資源,
    可以查看一下 v$access 和 v$locked_object 這兩個view,如果發現其他進程鎖定了與 JOB相關的Object,
    包括PKG/Function/Procedure/Table等資源,那麼就要把其他進程刪除,有必要的話,把JOB的進程也刪除,再重新跑看看結果。

    5.如果上面都正常,但是JOB還不run,怎麼辦?那我們要考慮把JOB進程重啟一次,防止是SNP進程死了造成JOB不跑,指令如下:

    alter system set job_queue_processes=0 ——關閉job進程,等待5——10秒鐘

    alter system set job_quene_processes=5 ——恢復原來的值       
    
   

創作者介紹

Thinking in Robert

羅伯特 發表在 痞客邦 PIXNET 留言(4) 人氣()


留言列表 (4)

發表留言
  • robertvmp
  • 怪怪的...
    後來又發生一些問題,變成下次的觸發時間永遠比現在的時間晚,
    就是要觸發的時間,已經過了,變成永遠不會觸發了...Orz

    所以我改用
    EXECUTE DBMS_JOB.CHANGE( 1 , null, TO_DATE('20100503170000','YYYYMMDDHH24MISS'), null);
    設定一個未來的時間,繼續觀察中 Orz
  • robertvmp
  • 冏...
    突然遇到 DATABASE LINK 怪怪的,造成排程執行逾時,
    BROKEN 的值變成 Y 了,
    改用下列方法修正,使BROKEN = N
    EXECUTE DBMS_JOB.BROKEN(1 , FALSE , TO_DATE('20100511090000','YYYYMMDDHH24MISS') );

  • robertvmp
  • 建立並指定下次時間的範例 (每天一次)
    SQL> variable jobno number;
    SQL> exec dbms_job.submit(:jobno, 'Pro_del_tablebk;',
    trunc(SYSDATE + 1) + (1 / 24) + (5 / 1440), --下次開始時間 = 01:05
    'trunc(SYSDATE + 1)' ); --間隔 = 明日同一時間
  • robertvmp
  • 建立並指定下次時間的範例 (現在開始後,每分鐘一次)
    VARIABLE jobno number;
    BEGIN
    DBMS_JOB.SUBMIT(:jobno,
    'P_RCB_SYNC(''G221'');' ,
    SYSDATE,
    'sysdate+ (1/1440)' );
    commit;
    END;
    /