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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值