oracle dbms调度程序,Oracle调度程序作业dbms_scheduler

整理scheduler这一部分,源于最近发现系统上自动采集统计信息的执行时间有些异常,执行时间被定义到了上午(这并不是一个很合理可靠的时间).在重新修改配置的同时,也顺便整理了这一块内容.

首先简单讲一下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,我需要他们顺次执行,于是我可以这么做:

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

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小时.

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

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等语法上有差别.

复杂点的,如:

JOB_NAME =>'MYTEST_JOB_2“,

工作类型=>'链',

job_action =>'MYTEST_CHAIN',

schedule_name =>'SYS.MYTEST_WINDOW_GROUP',

job_class =>'DEFAULT_JOB_CLASS“,

auto_drop => FALSE,

启用=> FALSE);

dbms_scheduler.set_attribute(名称=>'MYTEST_JOB_2“,属性=>'stop_on_window_close”,值=> FALSE,);

完;

调度程序作业属性的修改:

^比如,重新定义调度属性:

BEGIN

dbms_scheduler.set_attribute(名称=>'DAILY_PURGE_SCHEDULE',属性=>'repeat_interval',值=>'FREQ =报; BYHOUR = 1; BYMINUTE = 0; BYSECOND = 0')

结束;

^比如重新修改方案;

BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE(

name=>'P_1',

attribute=>'PROGRAM_ACTION',

value=>'/backup/2.sh');

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

应该说,这些视图根据字面意思来讲,比较好理解,也不做过多描述.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值