dbms_scheduler

"=

Oracle 10g引入dbms_scheduler來替代先前的dbms_job,在功能方面,它比dbms_job提供了更強大的功能和更靈活的機制/管理。

首先簡單講一下oracle 10g scheduler,10g引入dbms_scheduler來替代先前的dbms_job,在功能方面,它比dbms_job提供了更強大的功能和更靈活的機制/管理.它主要由以下幾大塊構成:

1.作業(job):

一個調度程式作業的實體.可以由dbms_scheduler.create_job創建生成.它可以自行指定作業屬性,也可以調用我們預先創建的一系列scheduler/ program/ chain/ job_class/ window/ window_group來匹配其作業屬性.

2.調度(scheduler):

一個任務計畫執行的時間策略.比如我們想要創建一個晚上3點執行的任務計畫,就可以創建一個調度,凡是符合這個調度要求的,都可以調用這個我們預先創建好的調度.可以用dbms_scheduler.create_schedule來創建一個調度.

比如我創建一個名字叫MYTEST_SCHEDULE的調度,每天4:00執行.

Begin dbms_scheduler.create_schedule( repeat_interval => 'FREQ=DAILY;BYHOUR=4;BYMINUTE=0;BYSECOND=0', start_date => systimestamp at time zone 'PRC', comments => '---this is my test schedule---', schedule_name => 'MYTEST_SCHEDULE'); end;

3.程式(program):

10g下的program支持分為3種形式,PL/SQL BLOCK/STORED PROCEDURE/EXECUTABLE.可以使用DBMS_SCHEDULER.CREATE_PROGRAM來創建一個program.

BEGIN DBMS_SCHEDULER.CREATE_PROGRAM( program_name=>'mytest_program_1', program_action=>'update mytest set id=id+1;', program_type=>'PLSQL_BLOCK', number_of_arguments=>0, comments=>'', enabled=>TRUE); END;

4.鏈(chain):

鏈可以看作是一個/幾個program/event scheduler的集合,為了維護需要,我們可能需要將很多不同的program放到一起依次執行,按照以前的模式,要么將這幾個program能整合成一個大的整體,要么分開幾個job來單獨執行,這無疑加重了維護負擔,而chain的出現,可以最佳化這個問題,我們將實現定義好的program集合到一起,然後統一制定一個job來執行,可以使用dbms_scheduler.create_chain來創建一個chain.

比如,在我的系統中,我分別創建了一個EXECUTABLE類型的和一個STORED PROCEDURE類型的program,我需要他們順次執行,於是我可以這么做:

BEGIN dbms_scheduler.create_chain( chain_name =>'MYTEST_CHAIN'); dbms_scheduler.define_chain_step( chain_name =>'MYTEST_CHAIN', step_name =>'mytest_chain_1', program_name =>'P_1'); dbms_scheduler.alter_chain( chain_name =>'MYTEST_CHAIN', step_name =>'mytest_chain_1', attribute=>'skip', value=>FALSE); dbms_scheduler.define_chain_step( chain_name =>'MYTEST_CHAIN', step_name =>'mytest_chain_2', program_name =>'P_2'); dbms_scheduler.alter_chain( chain_name =>'MYTEST_CHAIN', step_name =>'mytest_chain_2', attribute=>'skip', value=>FALSE); dbms_scheduler.enable('MYTEST_CHAIN'); END;

4.作業類(job_class):

定義了運行作業的資源使用者組.通過使用視窗中的資源計畫,我們可以在不同資源組和不同作業類之間分配資源.可以使用dbms_scheduler.create_job_class創建一個作業類.

BEGIN dbms_scheduler.create_job_class( logging_level => DBMS_SCHEDULER.LOGGING_RUNS, log_history => 100, resource_consumer_group => 'AUTO_TASK_CONSUMER_GROUP', job_class_name => 'MYTEST_JOB_CLASS'); END;

5.視窗(window):

可以看成是一個更高功能的調度,視窗可以調用系統中存在的調度(也可以自行定義執行時間),而且,具有資源計畫限制功能,視窗可以歸屬於某個視窗組.

可以使用DBMS_SCHEDULER.CREATE_WINDOW來創建一個視窗.

例如我創建了一個名為mytest_windows_1的視窗,採用DAILY_PURGE_SCHEDULE的調度方式,資源計畫限制方案為SYSTEM_PLAN,持續時間為4小時.

BEGIN DBMS_SCHEDULER.CREATE_WINDOW( window_name=>'mytest_windows_1', resource_plan=>'SYSTEM_PLAN', schedule_name=>'SYS.DAILY_PURGE_SCHEDULE', duration=>numtodsinterval(240, 'minute'), window_priority=>'LOW', comments=>''); END;

6.視窗組(window_group):

一個/幾個視窗的集合.10g默認的自動採集統計信息的調度就是一個視窗組的形式,譬如,設定兩個視窗,視窗一指定任務周日-----周五,晚上12點執行,而視窗二設定周六凌晨3點執行,這兩個視窗組成了一個視窗組,形成了這個job的執行調度策略.

可以使用DBMS_SCHEDULER.CREATE_WINDOW_GROUP來創建一個視窗組.

BEGIN DBMS_SCHEDULER.CREATE_WINDOW_GROUP( group_name=>'mytest_window_group', window_list=>'MYTEST_WINDOWS_1,WEEKEND_WINDOW'); END;

於是,使用dbms_scheduler創建一個job,我們可以調用各種預先定義的複雜屬性,也可以簡單的手動約定各個需要的屬性.

簡單的,如

BEGIN dbms_scheduler.create_job( job_name => ' MYTEST_JOB_1', job_type => 'PLSQL_BLOCK', job_action => 'update mytest set id=id+1;', repeat_interval => 'FREQ=MINUTELY;INTERVAL=10', start_date => sysdate, auto_drop => FALSE, enabled => TRUE); END;

跟採用dbms_job並不太大區別,只是repeat_interval等語法上有差別.

複雜點的,如:

BEGIN dbms_scheduler.create_job( job_name => 'MYTEST_JOB_2', job_type => 'CHAIN', job_action => 'MYTEST_CHAIN', schedule_name => 'SYS.MYTEST_WINDOW_GROUP', job_class => 'DEFAULT_JOB_CLASS', auto_drop => FALSE, enabled => FALSE); dbms_scheduler.set_attribute( name => 'MYTEST_JOB_2', attribute => 'stop_on_window_close', value => FALSE); END;

調度程式作業屬性的修改:

大部分的調度作業屬性的修改,都可以通過dbms_scheduler.SET_ATTRIBUTE和dbms_scheduler.SET_ATTRIBUT_NULL來完成.在此僅幾個舉例來說明,更多使用方法雷同.

^比如,重新定義scheduler屬性:

BEGIN dbms_scheduler.set_attribute( name => 'DAILY_PURGE_SCHEDULE', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0'); END;

^比如重新修改program;

BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name=>'P_1', attribute=>'PROGRAM_ACTION', value=>'/backup/2sh'); END;

^比如重新定義一個job屬性

BEGIN dbms_scheduler.set_attribute_null( name => 'GATHER_STATS_JOB', attribute => 'schedule_name'); dbms_scheduler.set_attribute( name => 'GATHER_STATS_JOB', attribute => 'repeat_interval', value => 'FREQ=DAILY;BYHOUR=2;BYSECOND=0'); END;

等等…....

相關的表/視圖:

SQL> select VIEW_NAME from dba_views a where a.view_name like 'DBA_SCHEDULER%'; VIEW_NAME ------------------------------ DBA_SCHEDULER_PROGRAMS DBA_SCHEDULER_JOBS DBA_SCHEDULER_JOB_CLASSES DBA_SCHEDULER_WINDOWS DBA_SCHEDULER_PROGRAM_ARGS DBA_SCHEDULER_JOB_ARGS DBA_SCHEDULER_JOB_LOG DBA_SCHEDULER_JOB_RUN_DETAILS DBA_SCHEDULER_WINDOW_LOG DBA_SCHEDULER_WINDOW_DETAILS DBA_SCHEDULER_WINDOW_GROUPS DBA_SCHEDULER_WINGROUP_MEMBERS DBA_SCHEDULER_SCHEDULES DBA_SCHEDULER_RUNNING_JOBS DBA_SCHEDULER_GLOBAL_ATTRIBUTE DBA_SCHEDULER_CHAINS DBA_SCHEDULER_CHAIN_RULES DBA_SCHEDULER_CHAIN_STEPS DBA_SCHEDULER_RUNNING_CHAINS

相關詞條

熱門詞條

聯絡我們