zoukankan      html  css  js  c++  java
  • 使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化

        Oracle GoldenGate不仅可以在线实时同步数据(包括增量和存量),也内置有一套事件触发流程,允许用户根据某张表某条记录的某个特殊字段值,触发相应的自定义执行流程,比如接收到某个银行账号的大笔转账金额之后,触发一条报警信息,或者根据某条记录,自动停止目标端的投递进程。

        基于变更记录触发事件的设置,如果是源端抽取进程,则在Table语句的FilterWhere中定义,如果是目标端投递进程,则可以在Replicat进程的MAP语句中定义。当然,也可以在一个SQLEXEC执行一条SQL语句或存储过程中定义。

        在Extract或参数文件中,通过使用 EVENTACTIONS 来定义自定义处理过程。EVENTACTIONS 可以带上多个关键字,比如 : IGNORE, DISCARD, ABORT, STOP, SHELL, TRACE, LOG ,每个关键字代表不同的处理功能,可参考官方文档查看。一旦有符合条件的记录,则触发对应的功能。

        本示例中,通过执行shell演示如下功能:当目标端接收完源端的所有数据之后,触发一个导出操作,即将目标库的数据导出为一个DMP文件。

        首先需要在源端创建一张作业状态表,当数据处理完成之后,插入一条标志源端执行完成的操作记录,当目标端replicat接收到此记录之后,则触发数据泵的导出操作。


    下面是源端的抽取进程参数

    EXTRACT ext1

    USERID idit_prd, PASSWORD idit_prd

    RMTHOST insodb02, MGRPORT 7809

    RMTTRAIL ./dirdat/cc

    TABLE idit_prd.myobjects ;

    TABLE idit_prd.ops_job_status ;

    目标端投递进程参数

    REPLICAT rep1

    SETENV (NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1")

    SETENV (ORACLE_SID=GGDB2)

    ASSUMETARGETDEFS

    USERID idit_prd,PASSWORD idit_prd

    MAP idit_prd.myobjects, TARGET idit_prd.myobjects;

    MAP idit_prd.ops_job_status, TARGET idit_prd.ops_job_status , FILTER (@STREQ (STATUS, "PROCESSING COMPLETE" )), EVENTACTIONS ( IGNORE TRANS , STOP, SHELL "/home/oracle/exp.sh" );


        本示例中的状态表为OPS_JOB_STATUS.

        目标端进程中在Filter中进行记录判断,比较在status字段中是否收到了“PROCESSING COMPLETE”的值,如果是,则触发后面EVENTACTIONS中指定的操作:

    ·  Ignore:忽略后续的操作事务,不再往OPS_JOB_STATUS表写入记录。

    ·  Stop:停止目标端投递进程

    ·  Shell: 执行指定的exp.sh脚本。



    以下是exp.sh的内容

    #!/bin/ksh

    /opt/oracle/product/server/10.2.0.4.5/bin/expdp idit_prd/idit_prd parfile=/home/oracle/exp.par


    parfile exp.par中定义的导出内容如下:

    tables=MYOBJECTS

    directory=dumpdir

    logfile=dumpdir:exp.log

    dumpfile=myobjects.dmp


    运行起来之后,可以看到目标端rep1进程还是运行状态:

    GGSCI (insodb02) 12>  !

    info replicat rep1

     

    REPLICAT   REP1      Last Started 2011-04-01 13:28  Status RUNNING

    Checkpoint Lag       00:00:00 (updated 00:00:08 ago)

    Log Read Checkpoint  File ./dirdat/cc000019

                         2011-04-01 13:06:05.059982  RBA 931


    当确认源端处理完了某部分数据,比如某个月或某年的记录之后,我们在源端的状态表中插入一条停止状态的记录:

    SQL> insert into ops_job_status values (sysdate,'PROCESSING COMPLETE');

     

    1 row created.

     

    SQL> commit;

     

    Commit complete.

       

    现在查看目标端进程的状态,可以看到投递进程rep1已经stopped,预期的data pump任务也已触发。可以在文件系统上查看导出的DMP文件(对应的data pump 导出目录)。

    投递进程状态:

    GGSCI (insodb02) 13> !

    info replicat rep1

     

    REPLICAT   REP1      Last Started 2011-04-01 13:28  Status STOPPED

    Checkpoint Lag       00:00:08 (updated 00:00:04 ago)

    Log Read Checkpoint  File ./dirdat/cc000019

                         2011-04-01 13:38:15.017514  RBA 1107

     

     导出的dmp文件

    oracle@insodb02:/u01/oracle> ls -lrt

     

    -rw-r--r--   1 oracle     dba           1051 Apr  1 13:38 exp.log

    -rw-r-----   1 oracle     dba        5009408 Apr  1 13:38 myobjects.dmp

     

    由此,我们可以看到,通过OGG,不仅可以在异构平台之后复制数据,也可以基于表里的变化数据,触发相应的脚本,从而实现我们期望的预警或监控运维。

     

     

  • 相关阅读:
    列表:一个打了激素的数组3
    列表:一个打了激素的数组2
    列表:一个打了激素的数组
    了不起的分支和循环03
    了不起的分支和循环02
    了不起的分支和循环01
    飞机大战游戏
    查找算法
    Pyhon之常用操作符
    将webkit内核封装为duilib的浏览器控件
  • 原文地址:https://www.cnblogs.com/margiex/p/9034330.html
Copyright © 2011-2022 走看看