Oracle任務調度概述數據庫
在Oracle中任務調度指某一執行程序在特定的時間被週期性的執行。Oracle把任務調度稱爲job。而一個基本的job由兩方面組成program和schedule。其中program指週期性執行的可執行程序,其中可包括PL\SQL匿名塊,存儲過程、函數、包以及操做系統的可執行腳本和外部程序等等。schedule指的是,調度program執行的週期。該週期既能夠基於特定時間被調度,也能夠基於某一事件被調度。於是JOB整體上可分爲兩大類,基於時間的JOB和基於事件的JOB。在Oracle 10g以前,採用dbms_job程序包來完成任務調度的相關工做。在Oracle 10g以後,Oracle推出了功能更增強大的dbms_schedule來完成任務調度工做,主要是因爲dbms_schedule可以基於事件進行任務調度而dbms_job沒法基於事件進行調度(筆者我的淺見,待驗證)! 函數
基於時間的JOBspa
建立Program截圖操作系統
Administration->Programs->Create日誌
建立Program的SQL以下事件
BEGIN DBMS_SCHEDULER.CREATE_PROGRAM( program_name=>'HR.INSERT_SYSDATE', program_action=>'begin insert into hr.job_test values(sysdate); commit; end', program_type=>'PLSQL_BLOCK', number_of_arguments=>0, comments=>'insert sysdate into table', enabled=>TRUE); END;圖片
其中program類型裏有3個選項分別表明資源
PLSQL_BLOCK:表示該程序爲可執行的PL\SQL匿名塊it
STORED_PORCEDURE:表示程序爲存儲過程、函數或程序包io
EXECUTABLE:表示程序爲位於操做系統上的可執行腳本或程序。
建立Schedule截圖
Administration->Schedules->Create
在Repeating部分,咱們指定啓動的頻率,在指定啓動頻率時應採用日曆表達式。起格式由3部分組成:頻率、間隔、特定時間點。
下面是一些簡單例子
每隔2天:FREQ=DAYLY;INTERVAL=2
每隔30妙:FREQ=SECONDLY;INTERVAL=30
每週的第一天:FREQ=WEEKLY;BYMONTHDAY=1
每個月的最後一天:FREQ=MONTHLY;BYMONTHDAY=-1
每週日的凌晨1點:FREQ=WEEKLY;BYDAY=SUN;BYHOUR=1
建立Schedule的SQL以下
BEGIN sys.dbms_scheduler.create_schedule( repeat_interval => 'FREQ=MINUTELY;INTERVAL=5', start_date => systimestamp at time zone '+8:00', comments => 'Start Every 5 minutes', schedule_name => '"HR"."INSERT_SCHE"'); END;
有了program和schedule以後咱們能夠把二者結合起來建立一個JOB。
利用已有program建立job
其中Logging Level爲job運行記錄中的日誌級別,分別有如下3個級別:
Log everything(FULL):表示記錄該job以及該job所在job class裏其餘job的日誌信息。
Log job runs only(RUNS):表示記錄每次運行該job時產生的日誌信息。
NO logging(OFF):表示關閉日誌記錄功能。
這裏的JOB CLASS的做用爲,將一個或多個做業與一個Resource Manager用戶組關聯在一塊兒,進行資源控制!
利用已有schedule建立job
其中Schedule Type中可選擇Schedule的類型
Standard:爲標準的Schedule類型,須要用戶自行定義Schedule的時間
Use Pre-defined Schedule:使用以前定義過的Schedule
Standard Using PL\SQL for repeated interval:使用PL\SQL編寫Schedule的時間
Use Pre-defined Window:使用以前定義的Window
Event:使用基於時間的Schedule
JOB裏的Options選項
Priority:在相同的JOB CLASS中分配資源的等級。
Schedule Limit(minutes):計劃執行的任務若是在計劃時間內沒有被執行則在Schedule Limit規定的時間內從新執行。該選項只對重複執行的任務有效。
Maximum Runs:任務執行成功次數達到Maximum Runs指定的次數後任務則再也不執行
Maximum Failures:持續執行的任務可失敗的最大次數,達到Maximum Failures指定的值後該任務自動失效
Job Weight:該JOB所支持的最大並行查詢
Instance Stickiness:應用在RAC環境中。若是設置爲TRUE,那麼該JOB將在負載最輕的實例上運行。若是設置爲FLASE,將在第一個有效的節點上運行嗯該JOB。
建立JOB的SQL以下
BEGIN sys.dbms_scheduler.create_job( job_name => '"HR"."INSERT_JOB"', program_name => 'HR.INSERT_SYSDATE', schedule_name => 'HR.INSERT_SCHE', job_class => 'DEFAULT_JOB_CLASS', comments => 'insert sysdate into table', auto_drop => FALSE, enabled => FALSE); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'schedule_limit', value => numtodsinterval(1, 'minute')); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'job_priority', value => 2); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'max_runs', value => 10); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'max_failures', value => 3); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'job_weight', value => 4); sys.dbms_scheduler.set_attribute( name => '"HR"."INSERT_JOB"', attribute => 'instance_stickiness', value => TRUE); END;
如下是調度任務執行的結果
SQL> select * from job_test;
DATE1 ------------------- 2011-04-14 11:32:07 2011-04-14 11:37:07 2011-04-14 11:42:07 2011-04-14 11:47:07 2011-04-14 11:52:07 2011-04-14 11:57:07 2011-04-14 12:02:07 2011-04-14 12:07:07 查看任務的運行日誌
Administration->Jobs->History
默認狀況下,數據庫自身定義了一個PURGE_JOB的任務。該任務天天凌晨3點鐘啓動,清除30天前所產生的任務日誌。若是進行相應的修改可單擊「Global Attributes」或者直接修改"PURGE_JOB"。亦可單擊Purge All Logs手動刪除全部日誌。