[轉]全面學習ORACLE Scheduler特性(2)管理jobs
1.2 管理Jobs
1.2.1 啟用Jobs
前面創建JOB時,由于未顯式的指定ENABLED參數,因此即使指定了START_DATE,不過默認情況下JOB不會自動執行。對于這種情況,DBMS_SCHEDULER包中提供了一個過程ENABLE,可以用來修改JOB的啟用狀態,調用方式非常簡單,例如:
SQL> exec dbms_scheduler.enable(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed.
1.2.2 禁用Jobs
DBMS_SCHEDULER.ENABLE 僅用來將JOB(其實不僅僅對JOB有效,對于CHAIN、PROGRAM等也有效)的啟用狀態置為TRUE。如果想將其啟用狀態置為FALSE?簡單,還有一個與該功能對應的過程:DBMS_SCHEDULER.DISABLE,例如:
SQL> exec dbms_scheduler.disable(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed.
這兩個過程僅用來重置對象的狀態,因此均可以無限次執行,即使執行時對象已經被置為要指定的狀態。
1.2.3 修改Jobs
由于JOB的屬性眾多,難免時不時的可能會遇到需要修改的情況,比如說前面創建JOB時不小心,指定要執行的過程名輸入錯誤(完全有可能,CREATE_JOB在創建時不會自動檢查指定的過程是否有效,從這方面考慮,SCHEDULER不如普通JOB嚴謹哪),這種情況下就必然涉及到對JOB的修改(或者說重定義),沒問題,DBMS_SCHEDULER包中專門提供了一個過程SET_ATTRIBUTE,可以用來修改任務的屬性值。
例如,修改剛剛創建的JOB:INSERT_TEST_TBL執行的過程,執行語句如下:
SQL> exec dbms_scheduler.set_attribute(¨INSERT_TEST_TBL¨,¨JOB_ACTION¨,¨P_ INSERT INTOTEST¨);
PL/SQL procedure successfully completed
當然啦,我們這里執行的這條語句,執行跟沒執行沒有區別,此處僅做示例,大家表深究。
SET_ATTRIBUTE 過程雖然僅有三個參數,不過能夠修改的屬性值可是不少,以下列舉幾個較常用到的:
LOGGING_LEVEL :指定對jobs執行情況記錄的日志信息級別。
SCHEDULER 管理的JOB對任務的執行情況專門進行了記錄,同時用戶還可以選擇日志中記錄信息的級別,有下列三種選擇:
DBMS_SCHEDULER.LOGGING_OFF :關閉日志記錄功能;
DBMS_SCHEDULER.LOGGING_RUNS :對任務的運行信息進行記錄;
DBMS_SCHEDULER.LOGGING_FULL :記錄任務所有相關信息,不僅有任務的運行情況,甚至連任務的創建、修改等也均將記入日志。
提示:查看SCHEDULER管理的JOB,可以通過USER_SCHEDULER_JOB_LOG和USER_SCHEDULER_JOB_RUN_DETAILS兩個視圖中查詢
RESTARTABLE :指定jobs運行出錯后,是否能夠適時重啟
創建任務時如未明確指定,本參數默認情況下設置為FALSE,如果設置為TRUE,就表示當任務運行時出錯,下次運行時間點到達時仍會啟動,并且如果運行仍然出錯,會繼續重新運行,不過如果連接出錯達到6次,該job就會停止。
MAX_FAILURES :指定jobs最大連續出錯次數
該參數值可指定的范圍從1-1000000,默認情況下該參數設置為NULL,表示無限制。達到指定出錯次數后,該job會被自動disable。
MAX_RUNS :指定jobs最大運行次數
該參數值可指定的范圍從1-1000000,默認情況下該參數設置為NULL,表示無限制(只是運行次數無限制,實際job會否繼續運行,仍受制于end_date以及max_failures等參數的設置)。達到指定運行次數后,該job也將被自動disable,并且狀態會被置為COMPLETED。
JOB_TYPE :指定job執行的任務的類型
有四個可選值:¨PLSQL_BLOCK¨, ¨STORED_PROCEDURE¨, ¨EXECUTABLE¨, and ¨CHAIN¨。
JOB_ACTION :指定job執行的任務
這一參數所指定的值依賴于JOB_TYPE參數中的值,比如說JOB_TYPE設置為¨STORED_PROCEDURE¨,那么本參數值中指定的一定是ORACLE中的過程名。
START_DATE :指定job初次啟動的時間
END_DATE :指定job停止運行的時間
本參數又與AUTO_DROP相關聯,如果AUTO_DROP設置為TRUE的話,那么一旦job到達停止運行的時間,該job就會被自動刪除,否則的話job任何存在,不過狀態被修改為COMPLETED。
除此之外,其它還包括MAX_RUN_DURATION,JOB_WEIGHT,INSTANCE_STICKINESS,STOP_ON_WINDOW_CLOSE,JOB_PRIORITY,SCHEDULE_LIMIT,PROGRAM_NAME,NUMBER_OF_ARGUMENTS,SCHEDULE_NAME,REPEAT_INTERVAL,JOB_CLASS,COMMENTS,AUTO_DROP,EVENT_SPEC,RAISE_EVENTS等等,這些參數所代表的意義此處不一一詳述,感興趣的朋友可以查閱相關官方文檔,或者等待本系列文章的外傳,黑黑。
僅從這些可設置屬性就可以看出,Scheduler管理的job確實非常靈活,上述提到了這些參數,均可以使用DBMS_SCHEDULER.SET_ATTRIBUTE過程進行設置。
另外需要注意一點,除了用戶手動創建的jobs之外,數據庫在運行過程中也有可能自動創建jobs。對于這類jobs除非必要,否則不建議進行修改。至于如何區分jobs是用戶創建,還是數據庫自動創建,可以通過*_SCHEDULER_JOBS視圖的SYSTEM列來確定,如果該列顯示為TRUE,則表示由系統創建
1.2.4 執行Jobs
雖然說jobs大多都應該是自動執行,不過經過前面的示例,大家想必也認識到了,并不是說創建了jobs它就會自動執行,是否能夠真正自動執行并不是由你的主觀意愿就能直接決定,而是由jobs自身的多個相關屬性決定。
關于jobs自動執行的話題相信看完前面的內容后,應該都知道如何設置,下面主要演示,如何手動調用jobs并執行,這其中,當然少不了DBMS_SCHEDULER包。例如,手動執行前面剛剛創建的job:INSERT_TEST_TBL:
SQL> exec dbms_scheduler.run_job(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed
Jobs 每執行一次,無論成功或失敗,均會在*_SCHEDULER_JOB_LOG中生成一條對應的記錄(前提是LOGGING_LEVEL屬性值未設置為DBMS_SCHEDULER.LOGGING_OFF),同時,用戶也可以通過*_SCHEDULER_JOB_RUN_DETAILS視圖查詢job執行的詳細信息。
1.2.5 停止Jobs
停止job可以使用DMBS_SCHEDULER.STOP_JOB過程,例如:
SQL> exec dbms_scheduler.stop_job(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed
注意,STOP_JOB過程不僅僅是更新job的狀態,而是停止當前正在執行的任務,如果你處理的任務當前未在運行的話,那么執行STOP_JOB過程,會觸發ORA-27366錯誤。
停止Jobs也會觸發一條任務的日志信息,對于執行停止操作的job,其*_SCHEDULER_JOB_LOG視圖的OPERATION會記錄為¨STOPPED¨,ADDITIONAL_INFO列中記錄的信息類似¨REASON="Stop job called by user: username"¨。
1.2.6 刪除Jobs
刪除創建的job就比較簡單了,直接執行DBMS_SCHEDULER.DROP_JOB過程即可,例如:
SQL> exec dbms_scheduler.drop_job(¨INSERT_TEST_TBL¨);
PL/SQL procedure successfully completed
刪除jobs并不是修改該job中某個字段的標記值,而是直接刪除其在數據字典中的字義,因此被刪除的job如果未來發現仍然需要,只能重建,而無法通過其它方式快速恢復。不過,刪除jobs的操作,并不會級聯刪除這些job曾經執行過的日志信息。
=======================================
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/didiaodezhu/archive/2009/12/16/5019747.aspx