Oracle调度程序作业dbms_scheduler

张森856

张森856

2016-02-19 18:46

下面图老师小编要向大家介绍下Oracle调度程序作业dbms_scheduler,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

  整理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=systimestampattimezone'PRC',
  comments='---thisismytestschedule---',
  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='updatemytestsetid=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'),

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  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='updatemytestsetid=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/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;

  等等…....

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  相关的表/视图:

  SQLselectVIEW_NAMEfromdba_viewsawherea.view_namelike'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

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

展开更多 50%)
分享

猜你喜欢

Oracle调度程序作业dbms_scheduler

编程语言 网络编程
Oracle调度程序作业dbms_scheduler

MySQL事件调度器(Event Scheduler)

编程语言 网络编程
MySQL事件调度器(Event Scheduler)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

进程调度模拟程序

编程语言 网络编程
进程调度模拟程序

PL/SQL实现Oracle数据库任务调度

SQLServer
PL/SQL实现Oracle数据库任务调度

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle的恢复管理器及DBMS_JOB包分析

电脑网络
Oracle的恢复管理器及DBMS_JOB包分析

Scheduling (调度)

编程语言 网络编程
Scheduling (调度)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

安装Oracle 9i加载数据库时出错的解决方法

安装Oracle 9i加载数据库时出错的解决方法

ORACLE回滚段管理(上)

ORACLE回滚段管理(上)
下拉加载更多内容 ↓