dbms_scheduler

Oracle 10g引入了dbms_scheduler来替代dbms_job,提供更强大的功能和更灵活的管理机制。本文详细介绍了dbms_scheduler的组成部分,包括作业、调度、程序、链、作业类、窗口和窗口组,以及如何创建和管理这些组件,还展示了如何通过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
Oracle的DBMS_SCHEDULER包是一个强大的调度工具,它允许用户创建、管理和执行复杂的任务调度。相比传统的`DBMS_JOB`包,DBMS_SCHEDULER提供了更丰富的功能,包括灵活的调度选项、作业依赖关系、事件驱动的作业触发机制以及更精细的资源管理能力。 ### 1. 创建和管理作业 DBMS_SCHEDULER允许用户创建多种类型的作业,包括PL/SQL块、外部脚本(如shell脚本)、SQL脚本等。作业可以通过`CREATE_JOB`过程创建,并且可以指定详细的调度规则。 ```sql BEGIN DBMS_SCHEDULER.create_job ( job_name => 'my_job', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN my_procedure; END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0', enabled => TRUE ); END; ``` 在这个例子中,`my_job`每天凌晨2点执行一次,调用`my_procedure`过程。`repeat_interval`参数支持非常复杂的调度规则,比如每周某几天、每月某几天或特定的日期组合等。 ### 2. 作业依赖关系 DBMS_SCHEDULER支持作业之间的依赖关系,这意味着一个作业可以在另一个作业完成后启动。这种依赖关系可以通过`SET_JOB_DEPENDENCY`过程来设置。 ```sql BEGIN DBMS_SCHEDULER.set_job_dependency ( job_name => 'job2', dependency => 'job1' ); END; ``` 在上面的例子中,`job2`将在`job1`成功完成后执行。 ### 3. 事件驱动的作业 DBMS_SCHEDULER还支持基于事件的作业触发机制。例如,当数据库中发生特定事件(如表数据变化)时,可以触发作业执行。 ```sql BEGIN DBMS_SCHEDULER.create_event_trigger ( trigger_name => 'my_event_trigger', event_type => 'DATABASE', event_condition => 'tabname = ''my_table'' and eventtype = ''INSERT''', action => 'BEGIN my_procedure; END;' ); END; ``` 在这个例子中,当`my_table`表中有新的记录插入时,`my_procedure`过程将被调用。 ### 4. 资源管理 DBMS_SCHEDULER还提供了资源管理功能,允许用户限制作业使用的系统资源。例如,可以设置作业的最大运行时间、最大失败次数等。 ```sql BEGIN DBMS_SCHEDULER.set_attribute ( name => 'my_job', attribute => 'max_run_duration', value => INTERVAL '30' MINUTE ); END; ``` 在这个例子中,`my_job`的最大运行时间为30分钟。如果作业在30分钟内未能完成,它将被自动终止。 ### 5. 作业组管理 用户可以将多个作业组织成一个作业组,以便于管理和调度。作业组可以通过`CREATE_JOB_GROUP`过程创建,并且可以为作业组设置共同的属性。 ```sql BEGIN DBMS_SCHEDULER.create_job_group ( job_group_name => 'my_job_group', description => 'My Job Group' ); END; ``` 然后可以将作业添加到作业组中: ```sql BEGIN DBMS_SCHEDULER.add_job_to_group ( job_name => 'my_job', job_group_name => 'my_job_group' ); END; ``` ### 6. 作业日志和监控 DBMS_SCHEDULER提供了详细的作业日志和监控功能,用户可以通过查询`DBA_SCHEDULER_JOB_LOG`和`DBA_SCHEDULER_RUNNING_JOBS`视图来查看作业的执行状态和历史记录。 ```sql SELECT * FROM DBA_SCHEDULER_JOB_LOG WHERE JOB_NAME = 'my_job'; ``` 通过这些日志信息,用户可以轻松地跟踪作业的执行情况,并进行故障排除。 ### 7. 作业的启用和禁用 用户可以通过`ENABLE`和`DISABLE`过程来启用或禁用作业。禁用作业后,它将不再自动执行,但作业的定义仍然保留在数据库中。 ```sql BEGIN DBMS_SCHEDULER.disable(name => 'my_job'); END; ``` 要重新启用作业: ```sql BEGIN DBMS_SCHEDULER.enable(name => 'my_job'); END; ``` ### 8. 作业的删除 如果不再需要某个作业,可以通过`DROP_JOB`过程将其从数据库中删除。 ```sql BEGIN DBMS_SCHEDULER.drop_job(job_name => 'my_job'); END; ``` ### 9. 作业的暂停和恢复 DBMS_SCHEDULER还支持作业的暂停和恢复功能。暂停作业后,它将暂时停止执行,但作业的定义仍然保留在数据库中。 ```sql BEGIN DBMS_SCHEDULER.stop_job(job_name => 'my_job'); END; ``` 要恢复作业的执行: ```sql BEGIN DBMS_SCHEDULER.start_job(job_name => 'my_job'); END; ``` ### 10. 作业的优先级设置 DBMS_SCHEDULER允许用户为作业设置优先级,优先级高的作业将在优先级低的作业之前执行。优先级可以通过`SET_ATTRIBUTE`过程设置。 ```sql BEGIN DBMS_SCHEDULER.set_attribute ( name => 'my_job', attribute => 'priority', value => 1 ); END; ``` 在这个例子中,`my_job`的优先级被设置为1,优先级范围为1到5,1为最高优先级。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值