博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DBA2 第十四章:使用调度程序自动执行任务

Posted on 2011-09-25 11:43  little健健  阅读(522)  评论(0编辑  收藏  举报

主要组件和步骤

  • 组件
    • 作业”指定需要执行的内容和执行时间。
    • “计划”指定执行作业的时间和次数。
    • “程序”是有关特定可执行文件、脚本或过程的元数据集合。
  • 步骤
    • 创建程序
      • 管理-->程序--->创建
      • BEGIN
        DBMS_SCHEDULER.CREATE_PROGRAM(
        program_name => 'CALC_STATS2',
        program_action =>
        'HR.UPDATE_HR_SCHEMA_STATS',
        program_type =>
        'STORED_PROCEDURE',
        enabled => TRUE);
        END;
        /
    • 创建并使用计划
      • 管理--->调度-->创建
      • BEGIN
        DBMS_SCHEDULER.CREATE_SCHEDULE(
        schedule_name => 'stats_schedule',
        start_date => SYSTIMESTAMP,
        end_date => SYSTIMESTAMP + 30,
        repeat_interval =>
        'FREQ=HOURLY;INTERVAL=1',
        comments => 'Every hour');
        END;
        /
    • 创建并提交作业
      • 管理-->作业-->创建
    • 监视作业
      • [DBA|ALL]_SCHEDULER_JOB_RUN_DETAILS 视图
        • LOG_ID:日志条目的唯一标识符
        • LOG_DATE:日志条目的时间戳
        • OWNER:作业的所有者
        • JOB_NAME:作业的名称
        • STATUS:作业执行的状态
        • ERROR#:遇到的第一个错误的编号
        • REQ_START_DATE:作业计划启动的时间
        • ACTUAL_START_DATE:作业实际启动的时间
        • RUN_DURATION:作业执行的持续时间
        • INSTANCE_ID:运行作业的实例
        • SESSION_ID:运行作业的会话
        • SLAVE_PID:用于执行作业的从属进程的进程 ID 
        • CPU_USED:作业运行所用的CPU 量
        • ADDITIONAL_INFO:有关作业运行的附加信息

计划

  • 调度
    • 时间
    • 事件
  • 创建基于时间的作业
    • 示例
      • BEGIN
        DBMS_SCHEDULER.CREATE_JOB (
        job_name=>'HR.DO_BACKUP',
        job_type => 'EXECUTABLE',
        job_action => '/home/usr/dba/rman/nightly_incr.sh',
        start_date=> SYSDATE,
        repeat_interval=>'FREQ=DAILY;BYHOUR=23',
        /* next night at 11:00 PM */
        comments => 'Nightly incremental backups');
        END;
        /


    • job_type
      • PLSQL_BLOCK:匿名 PL/SQL 块
      • STORED_PROCEDURE:命名的PL/SQL、Java 或外部过程
      • EXECUTABLE:可以从操作系统命令行执行的命令
    • job_action 参数可以是要运行过程的名称、脚本的名称或操作系统命令的名称,也可以是匿名的 PL/SQL 代码块,具体取决于 job_type参数的值。
  • 创建基于事件的调度
    • 必须设置
      • 队列说明(应用程序将消息入队以启动作业)  queue_spec
      • 事件条件(与 Oracle Streams AQ 规则条件的语法相同),如果为 TRUE 则启动作业   event_condition
    • 示例:创建一个作业,如果成批装入的数据文件在上午 9:00 之前到达文件系统,则运行此作业。
      • BEGIN
        DBMS_SCHEDULER.CREATE_JOB (
        job_name=>'ADMIN.PERFORM_DATA_LOAD',
        job_type => 'EXECUTABLE',
        job_action => '/home/usr/dba/rman/report_failure.sh',
        start_date => SYSTIMESTAMP,
        event_condition => 'tab.user_data.object_owner =
        ''HR'' and tab.user_data.object_name = ''DATA.TXT''
        and tab.user_data.event_type =
        ''FILE_ARRIVAL''
        and tab.user_data.event_timestamp < 9
        ',
        queue_spec => 'HR.LOAD_JOB_EVENT_Q');
        END;
  • 基于事件的调度
    • 类型
      • 用户或应用程序生成的事件:应用程序可以引发由调度程序使用的事件。调度程序通过启动作业来回应事件。
      • 调度程序生成的事件:调度程序可以引发事件来指示在调度程序自身内发生的状态更改。
  • 创建复杂调度
    • INCLUDE:向日历表达式结果中添加日期列表
    • EXCLUDE:从日历表达式结果中删除日期列表
    • INTERSECT:只使用两个或多个计划公用的日期

作业链

  • 概述
    • 链是为达到组合目标而链接在一起的一系列已命名的程序。
    • 一个相关程序链中的每个位置都称为一个步骤
  • 创建步骤
    • 使用 CREATE_CHAIN 过程创建链
    • 定义(一个或多个)链步骤
      • 程序
      • 另一个链(嵌套链)
      • 事件
    • 创建链对象后,请定义链规则
      • DEFINE_CHAIN_RULE  向链中添加每个规则时均需要调用一次此过程
      • 每个规则都有一个条件和操作
    • 启动链
      • 用 ENABLE 过程启用链。
      • 要运行链,必须创建类型为“CHAIN”的作业。作业操作必须引用链名称。
  • 监视作业链
    • ALL_SCHEDULER_CHAINS 视图
      • 链所有者和名称;链的规则集名称和规则集所有者;规则数;步骤数;是否启用链;链是否使用求值间隔;以及链是否使用用户定义的规则集
    • ALL_SCHEDULER_CHAIN_RULES 视图
      • 为其定义规则的链的名称和所有者;规则名、所有者和条件;以及在条件求值结果为 TRUE 时要执行的操作
    • ALL_SCHEDULER_CHAIN_STEPS 视图
      • 为其创建步骤的链的名称和所有者;步骤名;程序名和所有者;是否应跳过步骤;以及步骤在完成后是否应暂停
    • ALL_SCHEDULER_RUNNING_CHAINS 视图
      • 链名称和所有者;指向链的作业的名称和所有者;链中步骤的名称及其当前状态;链步骤遇到的错误;链步骤开始和结束的时间;完成步骤所用的时间;以及运行步骤的作业的名称

高级概念

  • 概念
    • “窗口”由定义好起始时间和结束时间的时间间隔表示,用于在不同时间激活不同的资源计划。
    • “窗口组”表示一系列窗口,使用它可以更轻松地管理窗口。
    • “作业类”定义作业的类别,这些作业共享公用资源使用要求及其他特性。
  • 创建作业类
    • 管理-->作业类-->创建
    • EXECUTE DBMS_SCHEDULER.CREATE_JOB_CLASS( -
      job_class_name => 'ADMIN_JOBS', -
      resource_consumer_group => 'DAYTIME_JOBS', -
      logging_level => DBMS_SCHEDULER.LOGGING_OFF);


  • 创建窗口
    • /*为十二月份创建一个使用 END_OF_YEAR 资源计划的窗口,
      并且此窗口在每晚从东部标准时间 (EST) 下午 6:00 到第二天
      上午 6:00 有效。
      */


      BEGIN
      DBMS_SCHEDULER.CREATE_WINDOW(
      window_name => 'DEC_NIGHTS',
      resource_plan => 'END_OF_YEAR',
      start_date => '01-DEC-03 06.00.00 PM EST',
      repeat_interval => 'FREQ=DAILY; BYHOUR=18',
      duration => '0 12:00:00',
      end_date => '31-DEC-03 06.00.00 AM EST',
      comments => 'Every day at 6:00 PM');
      END;
      /
  • 区分窗口内作业的优先级
    • 两个级别
      • 级别区分优先级,使用的是资源计划
      • 在类内区分优先级,使用的是作业的作业优先级属性
    • 仅当属于同一类的两个作业同时启动时,才会考虑优先级。优先级较高的作业先启动。
    • 不能确保不同作业类中的作业按其优先级运行。