使用GoldenGate EVENTACTIONS執行資料的實時觸發和定製化

margiex發表於2018-05-14

    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,不僅可以在異構平臺之後複製資料,也可以基於表裡的變化資料,觸發相應的指令碼,從而實現我們期望的預警或監控運維。

 

 

相關文章