暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

scheduler的job chain正确打开方式

Oracle蓝莲花 2021-04-15
634

点击上方“Oracle蓝莲花”可以订阅哦
 

1.chain的相关概念和流程:

1.1

      chains实际上就是一组命名的任务,实现基于依赖关系的调度的方法,在这种调度中,任务的启动取决于一个或多个先前作业的结果。

     这种技术从oracle 10gR2开始引入,相当于企业级应用可能广泛度并不是太高。 

1.2

1.2  要创建和使用chain,需要按以下顺序完成以下任务:

    1.2.1 创建一个chain的对象,具体代码如下:

注意:

1. 使用CREATE_CHAIN过程创建一个chain。使用CREATE_CHAIN创建chain对象之后,将分别定义chain步骤和chain规则。

2. rule_set_name和evaluation_interval参数通常为空。evaluation_interval可以定义一个重复的区间,在这个区间内对chain规则求值。

    rule_set_name指的是在Oracle streams中定义的规则集。

    1.2.2如何定义chain的步骤,代码示例如下:

   1.2.3向chain中添加规则:

注意:

1. 首先使用DEFINE_CHAIN_RULE过程向chain中添加一条规则。对于要添加到chain中的每个规则,只需要调用一次这个过程即可。


2. 确定chain rule定义步骤何时运行,并定义步骤之间的依赖关系。每个规则都有一个条件和一个动作。每当计算规则时,如果规则的条件求值为  TRUE,则执行其操作,该条件可以包含调度器chain条件语法或SQL WHERE子句中有效的任何语法。语法可以包括对任何chain步骤的属性的引用,包括步骤完成状态。

  

3. 调度器chain条件语法采用以下两种形式之一:

可以将条件与布尔运算符AND, OR和NOT()组合起来创建条件表达式。表达式中可以使用括号来确定求值顺序。

4.具体规则详见oracle官网:https://docs.oracle.com/cd/B28359_01/server.111/b28310/scheduse009.htm#ADMIN12459

  

5. 下面的示例定义了一个规则,该规则在步骤1中启动chain,在步骤1完成时启动步骤2。rule_name和注释是可选的,默认为NULL。如果确实使用 rule_name,可以稍后使用另一个调用DEFINE_CHAIN_RULE重新定义该规则。新定义覆盖了前一个定义,代码示例如下:

    1.2.4如何启动chain,示例代码如下:

   1.2.5创建一个job调用chain:

2. 综合示例演示:

2.1

登录sys用户,新建用户,并通过DBMS_RULE_ADM.GRANT_SYSTEM_PRIVILEGE授予权限,示例代码如下:

注意:

如果指定表空间,想着配置配额,例如:ALTER USER   chains QUOTA UNLIMITED ON tbs_oracle;

2.2

连接到新建立好的chains用户,创建两个programs

2.3

两个programs创建好了以后,我们开始按照第一章讲解的流程一次创建chain,第一步,先创建一个chains

2.4

第二步定义chain响应的步骤和规则

2.5

将chain功能启动:

2.6

通过job调用该chain

3.数据字典验证:

3.1

验证job是否生效:

3.2

验证对应测试表结果集:

3.3

验证程序是否开启

3.4

验证chain是否启动

3.5

验证chain的步骤

3.6

验证chain规则

3.7

验证chain运行状况

注意:

1.DBA_SCHEDULER_RUNNING_CHAINS显示运行chain的所有链步骤的状态

  2.这些chain步骤对当前用户可见(也就是说,那些用户具有ALTER权限的chain)。

  3.对于嵌套链,此数据字典还允许使用包含连接JOB_SUBNAME和STEP_JOB_SUBNAME列的CONNECT BY子句的SQL语句遍历链的层次结构


3.8

验证chain执行过程中报错信息和其他详细信息:

注意:

1.2018-10-20 14:43:09尝试调用程序期间,产生了报错信息,ORA-01950: no privileges on tablespace 'TBS_ORACLE'ORA-06512: at line 1,正是由于没有设置quota导致的。

2.后期调整quota之后,state调整为SUCCEEDED

4.删除chain任务:

5.基于event chain的处理原则:

5.1

权限控制:

5.2

新建立测试表:

注意:

1.dbms_scheduler.remove_event_queue_subscriber为删除事件队列订阅服务器,以防脚本以前已经运行过

  2.dbms_scheduler.add_event_queue_subscriber为该用户的消息添加一个事件队列订阅器。

5.3

创建两个程序:

5.4

创建chain

exec DBMS_SCHEDULER.CREATE_CHAIN ( chain_name =>'my_chain');

5.5

定义chain的规则和步骤:

5.6

为chain创建一个基于event的作业:

5.7

执行作业:

exec dbms_scheduler.enable('runchain_job');


注意:repeat_interval=>'freq=secondly;interval=30',表示间隔30秒,等一会,别着急

5.8

填充作业的任务队列:

exec dbms_scheduler.disable('runchain_job');

exec DBMS_SCHEDULER.ENABLE ('my_chain');

5.9

通过匿名块,把消息队列给打印出来:

注意:结果展示如下:

Event Type : JOB_STARTED

Owner : CHAINS

Object Name : RUNCHAIN_JOB

Timestamp : 20-10月-18 03.08.11.855000 下午 +08:00

Error : 0

5.10

    记得多运行几次匿名块,直到匿名块显示No more messages for chain_event就表示完成了。

6.备注信息:

6.1

    不同版本的ORA-27367的报错,重新执行一下程序就好了,这个没关系的。

<点亮梦想.拒绝平庸>

长按识别二维码加入600团队

   都认认真真看到这了,奖励自己个小心心吧~

文章转载自Oracle蓝莲花,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论