Oracle任務調度概述

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手動刪除全部日誌。

相關文章
相關標籤/搜索