Oracle任务调度的高级选项
在Oracle的調(diào)度任務(wù)概述
在Oracle的調(diào)度任務(wù)中不僅提供了program,job和schedul三個(gè)基本的組件,還提供了很多高級(jí)的組件。如
job class:用來將任務(wù)與資源計(jì)劃進(jìn)行關(guān)聯(lián),對(duì)資源請(qǐng)求相似的JOB可放置在相同JOB CLASS中。
window:表示在某段時(shí)間里啟動(dòng)與之關(guān)聯(lián)的job class中的job或schedule,同時(shí)將啟動(dòng)的JOB和window中相關(guān)的資源計(jì)劃進(jìn)行關(guān)聯(lián)
window group:把相關(guān)的window組合起來,作為一個(gè)組,方便管理和使用。
chain:一系列event_schedule、program和subchain的有機(jī)結(jié)合。?筆者個(gè)人淺見,應(yīng)用較少
下圖為調(diào)度任務(wù)的總體結(jié)構(gòu)關(guān)系
JOB CLASS
job class用于把那些對(duì)資源有相似請(qǐng)求的任務(wù)組合在一起,他可以與某個(gè)資源用戶組相關(guān)聯(lián),從而使得該job class中所有的任務(wù)都屬于該用戶組。那么當(dāng)這些任務(wù)在運(yùn)行時(shí)所能使用的資源,就由該用戶組所在的資源計(jì)劃控制。
創(chuàng)建job class
其中
logging_level選項(xiàng)的意義和job中的意義一樣,具體可參見http://czmmiao.iteye.com/blog/1003505
Resource Consumer Group表示與job class的用戶組,Service Name表示與job class關(guān)聯(lián)的服務(wù)。注意2者對(duì)立只能選其一。
Log Retention Period中的設(shè)置會(huì)覆蓋日志保留時(shí)間內(nèi)的全局配置。有關(guān)于日志保留時(shí)間內(nèi)的全局配置可參加http://czmmiao.iteye.com/blog/1003505
創(chuàng)建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表示明確定義的一段時(shí)間,包括起始時(shí)間和終止時(shí)間。比如,早上6點(diǎn)到下午6點(diǎn)就可以形成一個(gè)window,代表工作時(shí)間。window的最大作用在于可以同時(shí)與任務(wù)和資源計(jì)劃關(guān)聯(lián),一旦達(dá)到指定的時(shí)間段就可以啟動(dòng)任務(wù),并激活資源計(jì)劃。
比如說,晚上需要進(jìn)行某個(gè)DSS相關(guān)的任務(wù),這個(gè)任務(wù)可能從晚上10點(diǎn)持續(xù)到早上8點(diǎn),但是我們系統(tǒng)6點(diǎn)鐘就要運(yùn)行OLTP業(yè)務(wù),為了防止DSS任務(wù)消耗過多資源。我們需要進(jìn)行如下操作。
創(chuàng)建兩個(gè)window,WIN_NIGHT和WIN_DAY。為DSS_JOB建立一個(gè)job class,其名稱為DSS_CLASS。并將DSS_CLASS與用戶組BATCHA_CLASS建立關(guān)聯(lián)。同時(shí)將DSS_JOB與WIN_NIGHT建立關(guān)聯(lián)。到了晚上10點(diǎn)鐘,WIN_NIGHT打開,激活DSS_JOB啟動(dòng),并激活資源計(jì)劃PLAN_NIGHT。這時(shí)DSS_JOB以BATCH_GRP用戶組的身份運(yùn)行,所能使用的資源受PLAN_NIGHT控制。白天的時(shí)候,WIN_DAY啟動(dòng),并激活資源計(jì)劃PLAN_DAY。這時(shí)DSS_JOB還沒運(yùn)行完畢,則他能夠繼續(xù)運(yùn)行。但是所能使用的資源由PLAN_DAY控制。這樣就實(shí)現(xiàn)了資源的合理利用
如果需要,我們還可以把一組window合并起來,組成一個(gè)window group,這樣就可以更容易地管理多個(gè)window。
創(chuàng)建window
1、創(chuàng)建兩個(gè)資源計(jì)劃
?
?
2、創(chuàng)建兩個(gè)window
?
?
創(chuàng)建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、創(chuàng)建JOB
關(guān)于如何創(chuàng)建JOB可參見
http://czmmiao.iteye.com/blog/1003505
http://czmmiao.iteye.com/blog/1003618
?
其中Stop on Window Close表示window結(jié)束時(shí)任務(wù)終止,這里我們不要勾選該選項(xiàng)。
創(chuàng)建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;
當(dāng)window啟動(dòng)時(shí),Oracle并不會(huì)校驗(yàn)各個(gè)widnow的起始時(shí)間和終止時(shí)間是否從疊,但是同一個(gè)時(shí)間點(diǎn)上只能有一個(gè)window在運(yùn)行,這里也就存在矛盾的地方。Oracle采用如下機(jī)制解決這個(gè)問題。
1、如果準(zhǔn)備啟動(dòng)的window的優(yōu)先級(jí)別等于當(dāng)前正在運(yùn)行的window的優(yōu)先級(jí)別,則正則運(yùn)行的window繼續(xù)運(yùn)行,準(zhǔn)備運(yùn)行的window必須等到正在運(yùn)行的window結(jié)束才能啟動(dòng)。反之,則停止當(dāng)前運(yùn)行的window,啟動(dòng)優(yōu)先級(jí)高的window。
2、如果在當(dāng)前沒有正在運(yùn)行的window但是同一時(shí)間點(diǎn)有多個(gè)window需要啟動(dòng),且優(yōu)先級(jí)相等,則運(yùn)行時(shí)間長(zhǎng)的window被啟動(dòng)。
注意,oracle只提供了window兩個(gè)優(yōu)先級(jí):Low 、High
創(chuàng)建chain
總結(jié)
以上是生活随笔為你收集整理的Oracle任务调度的高级选项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下加入回收站功能
- 下一篇: 从技术走向IT管理