Oracle任务调度的高级选项
在Oracle的調度任務概述
在Oracle的調度任務中不僅提供了program,job和schedul三個基本的組件,還提供了很多高級的組件。如
job class:用來將任務與資源計劃進行關聯,對資源請求相似的JOB可放置在相同JOB CLASS中。
window:表示在某段時間里啟動與之關聯的job class中的job或schedule,同時將啟動的JOB和window中相關的資源計劃進行關聯
window group:把相關的window組合起來,作為一個組,方便管理和使用。
chain:一系列event_schedule、program和subchain的有機結合。?筆者個人淺見,應用較少
下圖為調度任務的總體結構關系
JOB CLASS
job class用于把那些對資源有相似請求的任務組合在一起,他可以與某個資源用戶組相關聯,從而使得該job class中所有的任務都屬于該用戶組。那么當這些任務在運行時所能使用的資源,就由該用戶組所在的資源計劃控制。
創建job class
其中
logging_level選項的意義和job中的意義一樣,具體可參見http://czmmiao.iteye.com/blog/1003505
Resource Consumer Group表示與job class的用戶組,Service Name表示與job class關聯的服務。注意2者對立只能選其一。
Log Retention Period中的設置會覆蓋日志保留時間內的全局配置。有關于日志保留時間內的全局配置可參加http://czmmiao.iteye.com/blog/1003505
創建job class的sql如下
BEGIN
sys.dbms_scheduler.create_job_class(
logging_level => DBMS_SCHEDULER.LOGGING_RUNS,
log_history => 20,
resource_consumer_group => 'BATCH_GRP',
comments => 'Job classe for DSS job',
job_class_name => 'DSS_JOB_CLASS');
END;
WINDOW
windo表示明確定義的一段時間,包括起始時間和終止時間。比如,早上6點到下午6點就可以形成一個window,代表工作時間。window的最大作用在于可以同時與任務和資源計劃關聯,一旦達到指定的時間段就可以啟動任務,并激活資源計劃。
比如說,晚上需要進行某個DSS相關的任務,這個任務可能從晚上10點持續到早上8點,但是我們系統6點鐘就要運行OLTP業務,為了防止DSS任務消耗過多資源。我們需要進行如下操作。
創建兩個window,WIN_NIGHT和WIN_DAY。為DSS_JOB建立一個job class,其名稱為DSS_CLASS。并將DSS_CLASS與用戶組BATCHA_CLASS建立關聯。同時將DSS_JOB與WIN_NIGHT建立關聯。到了晚上10點鐘,WIN_NIGHT打開,激活DSS_JOB啟動,并激活資源計劃PLAN_NIGHT。這時DSS_JOB以BATCH_GRP用戶組的身份運行,所能使用的資源受PLAN_NIGHT控制。白天的時候,WIN_DAY啟動,并激活資源計劃PLAN_DAY。這時DSS_JOB還沒運行完畢,則他能夠繼續運行。但是所能使用的資源由PLAN_DAY控制。這樣就實現了資源的合理利用
如果需要,我們還可以把一組window合并起來,組成一個window group,這樣就可以更容易地管理多個window。
創建window
1、創建兩個資源計劃
?
?
2、創建兩個window
?
?
創建win_night的sql如下
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
window_name=>'WIN_NIGHT',
resource_plan=>'PLAN_NIGHT',
start_date=>systimestamp at time zone '+8:00',
duration=>numtodsinterval(480, 'minute'),
repeat_interval=>'FREQ=DAILY;BYHOUR=22;BYMINUTE=0;BYSECOND=0',
end_date=>null,
window_priority=>'LOW',
comments=>'Window for night');
END;?
3、創建JOB
關于如何創建JOB可參見
http://czmmiao.iteye.com/blog/1003505
http://czmmiao.iteye.com/blog/1003618
?
其中Stop on Window Close表示window結束時任務終止,這里我們不要勾選該選項。
創建job的sql如下
BEGIN
sys.dbms_scheduler.create_job(
job_name => '"SYS"."DSS_JOB"',
job_type => 'PLSQL_BLOCK',
job_action => 'declare
?? i number;
?? j number;
begin
?? i:=0;
?? loop
????? j:=sqrt(i);
????? i:=i+1;
??? end loop;
end;',
schedule_name => 'SYS.WIN_NIGHT',
job_class => 'DSS_JOB_CLASS',
auto_drop => FALSE,
enabled => FALSE);
sys.dbms_scheduler.set_attribute( name => '"SYS"."DSS_JOB"', attribute => 'stop_on_window_close', value => FALSE);
sys.dbms_scheduler.enable( '"SYS"."DSS_JOB"' );
END;
當window啟動時,Oracle并不會校驗各個widnow的起始時間和終止時間是否從疊,但是同一個時間點上只能有一個window在運行,這里也就存在矛盾的地方。Oracle采用如下機制解決這個問題。
1、如果準備啟動的window的優先級別等于當前正在運行的window的優先級別,則正則運行的window繼續運行,準備運行的window必須等到正在運行的window結束才能啟動。反之,則停止當前運行的window,啟動優先級高的window。
2、如果在當前沒有正在運行的window但是同一時間點有多個window需要啟動,且優先級相等,則運行時間長的window被啟動。
注意,oracle只提供了window兩個優先級:Low 、High
創建chain
總結
以上是生活随笔為你收集整理的Oracle任务调度的高级选项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下加入回收站功能
- 下一篇: 从技术走向IT管理