zoukankan      html  css  js  c++  java
  • 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,我需要他们顺次执行,于是我可以这么做:


    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_ATTRIBUTEdbms_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;


         等等…....



    相关的表/视图:



    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



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

  • 相关阅读:
    .net解决跨域问题
    win7系统安装不了Visual Studio及sql server相关问题整理
    Visual Studio注释代码段快捷键
    实现文件下载,将后台返回的字节流转成下载链接
    表单中输入内容,搜索时,下面table中该列中包含关键字的高亮显示
    实现select联动效果,数据从后台获取
    vue的v-model指令
    SSM框架中,controller的action返回参数给vue.js
    vue路由实现多视图的单页应用
    关于vue的增删改查操作
  • 原文地址:https://www.cnblogs.com/doc/p/1384018.html
Copyright © 2011-2022 走看看