请选择 进入手机版 | 继续访问电脑版

ORACLE_OCP之Oracle Scheduler( ORACLE调度器)自动执行任务

[复制链接]
科达工艺 发表于 2021-1-2 19:43:56 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
ORACLE_OCP之Oracle Scheduler( ORACLE调理器)自动执行任务



  • 文章目的:

    • 使用Oracle Scheduler简化管理任务
    • 创建作业,操持和调理日程
    • 监督作业执行
    • 使用基于时间或基于事件的操持来执行Oracle Scheduler作业
    • 形貌窗口,窗口组,作业种别和消费组的使用
    • 使用电子邮件通知
    • 使用工作链执行一系列相关任务
    • 形貌远程系统上的调理器作业
    • 使用高级调理器功能对作业举行优先级排序

一、简化任务管理


二、明白简朴的JOB

  1. BEGINsys.dbms_scheduler.create_job( job_name => '"HR"."CREATE_LOG_TABLE_JOB"',job_type => 'PLSQL_BLOCK', job_action => 'begin   execute immediate (''create table session_history(   snap_time TIMESTAMP WITH LOCAL TIME ZONE,    num_sessions NUMBER)'');  end;',start_date => systimestamp at time zone 'America/New_York',job_class => 'DEFAULT_JOB_CLASS',comments => 'Create the SESSION_HISTORY table',auto_drop => FALSE, enabled => TRUE);END;
复制代码
三、Oracle Scheduler Core Components ORACLE 调理器内核组件


四、使用ORACLE调理器



  • 使用调理器简化任务:

    • 创建步伐(启用或禁用)-可选

      • 在多个作业中重用此利用
      • 在不需要重新创建PL/SQL块的情况下更改作业的步伐

    • 创建一个调理操持.
    • 创建并提交作业.(定时执行)

五、使用ORACLE调理器



  • 您可以通过使用EMCC控制或通过使用DBMS_SCHEDULER - PL / SQL包来执行所有步调。

    • 1.创建步伐

      • 使用CREATE_PROGRAM过程创建一个步伐。创建步伐是使用操持步伐的可选步调。您还可以在CREATE_JOB过程中对要在匿名PL / SQL块中执行的利用举行编码。通太过别创建步伐,可以一次界说利用,然后在多个作业中重复使用该利用。这使您可以更改作业的步伐,而不必重新创建PL / SQL块。
        默认情况下,步伐是在禁用状态下创建的(除非ENABLED参数设置为TRUE)。禁用的步伐只有在启用后才气由作业执行。您可以通过为ENABLED指定TRUE值来指定应在启用状态下创建步伐。

    • 2.创建和使用调理操持

      • 作业操持可以是预界说的操持(通过CREATE_SCHEDULE过程创建),也可以界说为作业创建的一部分。
        该操持指定有关何时运行作业的属性,比方:
        开始时间(界说开始执行的时间)和竣事时间(指定竣事时间,之后该时间不再有效且不再举行调理)
        该表达式指定作业的重复隔断
        通过归并现有时间表创建的复杂时间表
        开始作业之前必须满足的条件或状态厘革(称为事件)
        通过使用调理日程(而不是在作业界说中指定作业的执行时间),您可以管理多个作业的操持执行,而不必更新多个作业界说。如果修改了日程表,则使用该日程表的每个作业都会自动使用新的日程表。

    • 3.创建和运行作业

      • 作业是日程安排和对利用的形貌以及作业所需的任何其他参数的组合。您可以为作业设置许多属性。属性控制作业的执行方式。


六、恒久的轻量级作业



  • 淘汰开始工作所需的开销和时间
  • 占用磁盘上的空间很小,主要用于作业元数据和用于存储过程运行时数据
  • 从作业模板创建(在下令行中)

七、基于时间的作业



  • Example:创建一个从今晚开始的每晚11:00调用备份脚本的作业
    1. 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;/
    复制代码
八、创建一个基于事件的调理操持



  • 创建一个基于事件的作业, 你必须设置:

    • 队列规范(您的应用步伐需要在队列消息中以开始作业)
    • 一个事件条件(与Oracle Streams AQ规则条件相同的语法),如果为TRUE,则开始作业


九、创建一个基于事件的作业



  • Example:创建一个作业,该作业将批量加载数据文件,而且在9:00 AM之前到达文件系统时运行.
    1. BEGIN DBMS_SCHEDULER.CREATE_JOB(  job_name=>&#39;ADMIN.PERFORM_DATA_LOAD&#39;,  job_type => &#39;EXECUTABLE&#39;,  job_action => &#39;/loaddir/start_my_load.sh&#39;,  start_date => SYSTIMESTAMP,  event_condition => &#39;tab.user_data.object_owner =   &#39;&#39;HR&#39;&#39; and tab.user_data.object_name = &#39;&#39;DATA.TXT&#39;&#39;   and tab.user_data.event_type = &#39;&#39;FILE_ARRIVAL&#39;&#39;   and tab.user_data.event_timestamp < 9 &#39;,  queue_spec => &#39;HR.LOAD_JOB_EVENT_Q&#39;);END;
    复制代码
十、基于事件的调理



  • 事件范例:

    • 由用户生成或应用步伐生成的事件
    • 由调理步伐生成的事件

  • 调理器作业引发的事件:

    • JOB_STARTED
    • JOB_SUCCEEDED
    • JOB_FAILED
    • JOB_BROKEN
    • JOB_COMPLETED
    • JOB_STOPPED
    • JOB_SCH_LIM_REACHED
    • JOB_DISABLED
    • JOB_CHAIN_STALLED
    • JOB_ALL_EVENTS
    • JOB_RUN_COMPLETED
    • JOB_OVER_MAX_DUR

  • Example of raising an event:
       
        DBMS_SCHEDULER.SET_ATTRIBUTE(‘hr.do_backup’,
    ‘raise_events’, DBMS_SCHEDULER.JOB_FAILED);
       

十一、创建复杂的调理操持



  • INCLUDE:将日期列表添加到日历表达式效果中
  • EXCLUDE:从日历表达式效果中删除日期列表
  • INTERSECT:仅使用两个或两个以上时间表的共同日期

十二、使用电子邮件通知



  • 通过电子邮件通知更改作业状态
  • 由作业状态事件触发
  • 多个通知,多个收件人
  • * _SCHEDULER_NOTIFICATIONS视图
  • 使用调理器的电子邮件告知功能:

    • 指定将用于发送电子邮件的SMTP服务器的地点:
           
            DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE
      (‘email_server’,‘host[:port]’);
           

    • (可选)设置默认的发件人电子邮件地点:
           
            DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE
      (‘email_sender’,‘valid email address’);
           

    • 添加指定作业的电子邮件通知
           
            DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION (
      job_name IN VARCHAR2,
      recipients IN VARCHAR2,
      sender IN VARCHAR2 DEFAULT NULL,
      subject IN VARCHAR2
      DEFAULT dbms_scheduler.default_notification_subject,
      body IN VARCHAR2
      DEFAULT dbms_scheduler.default_notification_body,
      events IN VARCHAR2
      DEFAULT ‘JOB_FAILED,JOB_BROKEN,JOB_SCH_LIM_REACHED,
      JOB_CHAIN_STALLED,JOB_OVER_MAX_DUR’,
      filter_condition IN VARCHAR2 DEFAULT NULL);
           
           
            DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION (
      job_name IN VARCHAR2,
      recipients IN VARCHAR2 DEFAULT NULL,
      events IN VARCHAR2 DEFAULT NULL);
           


十三、创建作业链



  • 创建一个链对象。
  • 界说链式步调。
  • 界说链规则。
  • 开始链:

    • 启用链。
    • 创建一个指向链的作业。




  • 链是一系列定名的步伐,这些步伐链接在一起以实现共同的目的。这就是所谓的“依赖关系调理”。链的示比方下:

    • 先运行步伐A,然后运行步伐B,但只有在步伐A和B乐成完成后才运行步伐C,否则运行步伐D。
      相互依赖的步伐链中的每个位置都称为一个步调。通常,在开始一组初始的连锁步调之后,后续步调的执行取决于一个或多个先前步调的完成。要创建和使用链,请按顺序完成以下步调。除非尚有说明,否则所有提到的过程都是DBMS_SCHEDULER软件包的一部分。

      • 1.使用CREATE_CHAIN过程创建一个链。链名称可以可选地用架构名称限定(比方,myschema.myname)。
      • 2.界说(一个或多个)链式步调。界说步调将为其定名,并指定该步调执行的利用。每个步调可以指向以下之一:

        • 一个步伐
        • 另一个链(嵌套链)
        • 一个事件
        • 您可以通过调用DEFINE_CHAIN_STEP过程来界说一个指向步伐或嵌套链的步调。
        • 要界说期待事件发生的步调,请使用DEFINE_CHAIN_EVENT_STEP过程。过程参数可以指向事件时间表,也可以包罗内联队列规范和事件条件。指向事件的步调将期待,直到引发指定事件为止。如果事件发生,则该步调乐成完成。

      • 3.创建链对象后,界说链规则。链式规则界说了步调运行的时间,并界说了步调之间的依赖性。每个规则都有一个条件和一个动作:

        • 如果条件评估为TRUE,则执行利用。该条件可以包罗在SQL WHERE子句中有效的任何语法。条件通常基于一个或多个先前步调的效果。比方,如果前两个步调乐成,则大概要运行一个步调,而如果前两个步调中的任何一个失败,则希望运行另一个步调。
        • 该利用指定触发规则后要执行的利用。范例的利用是运行指定的步调。大概的动作包罗开始或停止步调。您也可以选择竣事作业链的执行,返回值或步调名称和错误代码。
        • 添加到链中的所有规则共同作用以界说链的整体行为。当作业开始且在每个步调竣事时,将评估所有规则,以检察下一步将发生哪些动作。您可以使用DEFINE_CHAIN_RULE过程将规则添加到链中。您对要添加到链中的每个规则调用一次此过程。

      • 4.启动链涉及两个动作:

        • 使用“启用”过程启用链。 (始终将链创建为禁用状态,因此您可以在任何作业执行链之前将步调和规则添加到链中。)启用已启用的链不会返回错误。
        • 要运行链,您必须创建“链”范例的作业。作业利用必须引用链名称。您可以为此作业使用基于事件的操持或基于时间的操持。



十四、作业链的例子


十五、使用高级调理操持功能




  • 使用高级操持步伐功能,您可以对操持的各个方面举行更多控制,比方作业窗口和作业优先级。这些高级功能总结如下,

    • WINDOW(窗口)由具有明确界说的开始和竣事的时间隔断体现,并用于在差异时间激活差异的资源操持。这使您可以在一段时间内更改资源分配,比方一天中的时间或销售年份的时间。
    • WINDOW-GROUP(窗口组)代表窗口列表,并允许更轻松地管理窗口。您可以使用窗口或窗口组作为作业的操持,以确保仅在窗口及其关联的资源操持处于运动状态时才运行该作业。
    • JOB CLASS(作业类)界说了具有共同资源使用要求和其他特征的作业种别。作业种别将作业分为更大的实体。
    • Resource consumer group(资源消费组) 确定分配给作业种别中的作业的资源。
    • Resource plan(资源操持)使用户可以在资源消费组之间确定资源的优先级(最主要是CPU)。
       
        注意:灰色对象不是Scheduler对象。
       

十六、Job Classes(作业类)



  • 向成员作业分配相同的属性值聚集
  • 由CREATE_JOB_CLASS过程创建
  • 在作业类中指定作业(使用SET_ATTRIBUTE过程)
  • 属于SYS SCHEMA
  • 设置成员作业的资源分配
  • 将服务属性设置为目的数据库服务名称
  • 分组作业以举行优先排序

十七、Windows(窗口)



  • 调理器窗口:

    • 可以在差异时间段开始作业或更改作业之间的资源分配
    • One active at a time -> 一次一激活
    • 用CREATE_WINDOW过程创建


十八、在窗口中的作业优先级



  • 作业优先级:

    • 在类级别(通过资源操持)
    • 在作业级别(具有作业优先级属性)
    • 不包管适用于差异作业种别的工作


十九、Creating a Job Array(创建作业队列)



  • 1、声明范例为sys.job和sys.job_array的变量:
       
        DECLARE
    newjob sys.job;
    newjobarr sys.job_array;
       

  • 2、初始化作业队列:
       
        BEGIN
    newjobarr := SYS.JOB_ARRAY();
       

  • 3、调解作业队列的巨细以容纳所需的作业数:
       
        newjobarr.EXTEND(100);
       

  • 4、将作业放入作业队列:
       
        FOR i IN 1…100 LOOP
    newjob := SYS.JOB(job_name => ‘LWTJK’||to_char(i),
    job_style => ‘LIGHTWEIGHT’,
    job_template => ‘MY_PROG’,
    enabled => TRUE );
    newjobarr(i) := newjob;
    END LOOP;
       

  • 5、提交作业队列作为一项事务:
       
        DBMS_SCHEDULER.CREATE_JOBS(newjobarr,
    ‘TRANSACTIONAL’);
       

利用实例:

  1. DECLARE newjob sys.job; newjobarr sys.job_array;BEGIN -- Create an array of JOB object types newjobarr := sys.job_array(); -- Allocate sufficient space in the array newjobarr.extend(100); -- Add definitions for jobs FOR i IN 1..100 LOOP   -- Create a JOB object type   newjob := sys.job(job_name => &#39;LWTJK&#39; || to_char(i),                     job_style => &#39;LIGHTWEIGHT&#39;,                     job_template => &#39;PROG_1&#39;,                         enabled => TRUE ); -- Add job to the array   newjobarr(i) := newjob; END LOOP; -- Call CREATE_JOBS to create jobs in one transaction DBMS_SCHEDULER.CREATE_JOBS(newjobarr, &#39;TRANSACTIONAL&#39;);END;/
复制代码
二十、创建一个基于事件的文件监督器作业



  • 执行以下任务:

    • 创建一个Scheduler凭据对象,并授予EXECUTE权限。
    • 创建一个文件监督步伐,并授予EXECUTE权限。
    • 创建一个带有引用事件消息的元数据参数的Scheduler步伐对象。
    • 创建一个引用文件监督器的基于事件的作业。 (可选地,在相关的实例上执行)
    • 启用文件监督步伐和作业。

  • 创建一个基于事件的文件监督器作业。 您可以使用DBMS_SCHEDULER.SET_ATTRIBUTE过程来使作业针对的文件到达事件运行的每个实例,纵然该作业已经在处置处罚上一个事件。 将PARALLEL_INSTANCES属性设置为TRUE。
       
        BEGIN
    DBMS_SCHEDULER.SET_ATTRIBUTE(’’,‘PARALLEL_INSTANCES’, TRUE);
    END;
       

  • 这使该作业可以作为轻量级作业运行,以便可以快速启动该作业的多个实例。 如果将PARALLEL_INSTANCES设置为FALSE的默认值,则在基于事件的作业已经在处置处罚另一个事件时发生的文件监督步伐事件将被扬弃。
二十一、启用远程系统中的文件到达事件



  • 执行以下任务,以在远程系统上引发文件到达事件:

    • 设置数据库以运行远程外部作业。
    • 在第一个远程系统上安装,设置,注册和启动Scheduler署理。
    • 对每个其他远程系统重复步调2。

二十二、调理操持远程数据库作业



  • 创建一个作业,该作业在同一主机或远程主机上的另一个数据库实例上运行存储过程和匿名PL / SQL块。
  • 目的数据库可以是任何版本的Oracle数据库。
  • DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION和DBMS_SCHEDULER.CREATE_CREDENTIAL可以用于远程数据库作业。
  • 作业范例为PLSQL_BLOCK和STORED_PROCEDURE的作业可以是DESTINATION(目的地)和CREDENTIAL(凭据)属性的SET_ATTRIBUTE调用的主题。
二十三、创建远程数据库作业



  • 执行以下任务以创建远程作业:

    • 为远程作业设置原始数据库。
    • 通过使用DBMS_SCHEDULER.CREATE_JOB创建作业。
    • 通过使用DBMS_SCHEDULER.CREATE_CREDENTIAL创建证书。
    • 通过使用DBMS_SCHEDULER.SET_ATTRIBUTE设置作业CREDENTIAL_NAME属性。
    • 通过使用DBMS_SCHEDULER.SET ATTRIBUTE设置作业目的地属性。
    • 通过使用DBMS_SCHEDULER.ENABLE启用作业。

  • 要为远程作业设置原始数据库,请执行以下步调:

    • 1.确认已安装XML DB。
    • 2.启用到数据库的HTTP毗连。
           
            BEGIN
      DBMS_XDB.SETHTTPPORT(port);
      END;
           

    • 3.执行prvtrsch.plb脚本。
    • 4.设置调理步伐署理端的暗码。
           
            BEGIN
      DBMS_SCHEDULER.SET_AGENT_REGISTRATION_PASS(‘password’);
      END;
           

       
        有关详细示例,请参考《 Oracle数据库管理员指南》。
       

二十四、调理多个目的上的作业



  • 这使您可以指定要执行作业的多个目的数据库
  • 它提供了从创建作业的数据库中监督和控制作业的功能。
  • 在运行时,多目的作业被视为作业的聚集,它们相互之间副本近乎差不多。
  • 所有作业将根据作业开始日期中指定的时区执行,或使用源数据库的时区。
二十五、检察调理器元数据



  • 调理器管理视图,显示:

    • *_SCHEDULER_JOBS: 所有作业启用和禁用
    • *_SCHEDULER_SCHEDULES: 所有调理操持
    • *_SCHEDULER_PROGRAMS: 所有步伐
    • *_SCHEDULER_RUNNING_JOBS: 运动作业状态
    • *_SCHEDULER_JOB_LOG: 所有状态更改
    • *_SCHEDULER_JOB_RUN_DETAILS: 所有已运行过的作业

  1. SELECT job_name, status, error#, run_durationFROM user_scheduler_job_run_details;JOB_NAME           STATUS  ERROR#   RUN_DURATION ----------------   ------  ------   ------------ GATHER_STATS_JOB   SUCCESS      0   +000 00:08:20           PART_EXCHANGE_JOB  FAILURE   6576   +000 00:00:00
复制代码


  • 对于工作链:

    • * _SCHEDULER_RUNNING_CHAINS:显示所有运动链
    • * _SCHEDULER_CHAIN_STEPS:显示所有链的所有步调
    • * _SCHEDULER_CHAINS:显示所有链
    • * _SCHEDULER_CHAIN_RULES:显示所有链的所有规则

  • 对于Windows和其他高级对象:

    • * _SCHEDULER_WINDOWS显示所有窗口。
    • * _SCHEDULER_WINDOW_GROUPS显示所有窗口组。
    • * _SCHEDULER_WINGROUP_MEMBERS显示所有窗口组的成员,每个组成员一行。
    • * _SCHEDULER_JOB_LOG显示对作业举行的所有状态更改。
    • * _SCHEDULER_JOB_ROLES按数据库脚色显示所有作业。

  • 轻量级作业通过与通例作业相同的视图可见:

    • * _SCHEDULER_JOBS:显示所有作业,包罗JOB_STYLE =‘LIGHTWEIGHT’
    • * _SCHEDULER_JOB_ARGS:还显示轻量级作业的所有设置的参数值
      因为轻量级作业不是数据库对象,所以它们无法通过* _OBJECTS视图看到。

  • 从Oracle Database 11g第2版开始:

    • * _SCHEDULER_NOTIFICATIONS显示已设置的电子邮件通知。
    • * _SCHEDULER_FILE_WATCHERS显示文件监督步伐的设置信息。

  • 以下视图显示有关多个目的作业的信息:

    • * _SCHEDULER_DESTS:显示可以安排远程作业的所有目的。该视图既包罗外部目的(用于远程外部作业),又包罗远程数据库作业的数据库目的。
    • * _SCHEDULER_EXTERNAL_DESTS:显示所有已在数据库中注册并可用作远程外部作业目的的署理。
    • * _SCHEDULER_DB_DESTS:显示可以安排远程数据库作业的所有数据库。
    • * _SCHEDULER_GROUPS:显示架构中的组或数据库中的所有组。
    • * _SCHEDULER_GROUP_MEMBERS:显示架构中的组成员或数据库中的所有组成员。
    • * _SCHEDULER_JOB_DESTS:显示远程数据库上作业的状态。

  注意:在上面列出的视图中,视图名称开头的星号可以替换为DBA,ALL或USER。

来源:https://blog.csdn.net/XiaoHG_CSDN/article/details/112058602
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )