配置GoldenGate捕獲Replicat端資料應用異常

Appleses發表於2016-01-30

  考慮到GoldenGate對資料的邏輯處理方式,保不齊目標端可能由於什麼原因,沒能正確複製源端抽取到的資料,那麼,預設情況下,Replicat任務會中止並丟擲異常資訊。這裡,我們可以透過自定義的方式,定製錯誤的處理機制。

  異常捕獲操作均在目標端進行,源端不需要做什麼修改。

  首先建立一張日誌表,用來記錄異常資訊,這個表的列可以根據實際情況進行定製,並沒有強制性的標準:

    create table jss.j1_data_change_log

    (

      REP_NAME     VARCHAR2(30),

      OID          NUMBER,

      TABLE_NAME   VARCHAR2(30),

      OPTYPE        VARCHAR2(30),

      COMMIT_DATE  TIMESTAMP,

      DBERRNUM     NUMBER,

      DBERRMSG     VARCHAR2(4000),

      LOGRBA       NUMBER,

      LOGPOSITION  NUMBER

    );

  該表必須擁有唯一索引(當然建個主鍵也可以的),這裡考慮透過時間和日誌在檔案中的相對位置做唯一鍵:

    create unique index uni_j1_data_clog on j1_data_change_log (logrba,logposition,commit_date);

  GoldenGate中有一個REPERROR選項,專用於replicat程式,可以用來控制replicat程式處理錯誤錯誤的方式。

  使用者可以定義多個REPERROR語句,其中一個REPERROR語句設定預設情況下錯誤處理方式,其它的REPERROR再來分別對不同的錯誤指定處理邏輯。這裡我們就透過REPERROR來捕獲異常資訊。

  在GoldenGate中修改replicat的配置,具體配置資訊如下:

    REPLICAT rep2

    ASSUMETARGETDEFS

    USERID ggate@target, PASSWORD ggate

    DISCARDFILE ./dirrpt/rep2_gg2.dsc, PURGE

    REPERROR (DEFAULT, EXCEPTION)

    REPERROR (DEFAULT2,ABEND)

    MAP jss.*, TARGET jss.*;

    MAP jss.j1, target jss.j1_data_change_log,

    EXCEPTIONSONLY,

    INSERTALLRECORDS,

    COLMAP ( rep_name = "rep2"

    ,oid = id

    ,table_name = @GETENV("GGHEADER","TABLENAME")

    ,optype = @GETENV ("GGHEADER", "OPTYPE")

    ,commit_date = @GETENV ("GGHEADER", "COMMITTIMESTAMP")

    ,dberrnum = @GETENV ("LASTERR", "DBERRNUM")

    ,dberrmsg = @GETENV ("LASTERR", "DBERRMSG")

    ,logrba = @GETENV ("GGHEADER", "LOGRBA")

    ,logposition = @GETENV ("GGHEADER", "LOGPOSITION"));

  主要意圖就是透過GETENV取到想要的環境變數資訊,並存入前面建立的日誌表。

    提示:注意MAP/COLMAP等關鍵字間,",/("等符號前必須要有空格,否則會遇到OGG-00212  Invalid option for MAP的錯誤資訊。

    注意2,源端物件必須執行add trandata schema.table啟用表級附加日誌,否則在源端執行update操作時,目前端會丟擲ORA-01403錯誤,提示記錄找不到

  當再執行同步時,目標端REPLICAT組的REPORT檔案中會記錄類似這樣的資訊:

    MAP resolved (entry JSS.J1):

      MAP JSS.J1, target jss.j1_data_change_log, EXCEPTIONSONLY, INSERTALLRECORDS, COLMAP ( rep_name = "rep2" ,oid =  id ,table_name = @GETENV("GGHEADER","TABLENAME") ,optype = @GETENV ("GGHEADER", "OPTYPE") ,co

    mmit_date = @GETENV ("GGHEADER", "COMMITTIMESTAMP") ,dberrnum = @GETENV ("LASTERR", "DBERRNUM") ,dberrmsg = @GETENV ("LASTERR", "DBERRMSG") ,logrba = @GETENV ("GGHEADER", "LOGRBA") ,logposition = @GETENV ("G

    GHEADER", "LOGPOSITION"));

    Using the following key columns for target table JSS.J1_DATA_CHANGE_LOG: LOGRBA, LOGPOSITION, COMMIT_DATE.

  如果遇到錯誤,可以直接透過查詢jss.j1_data_change_log表,來確定出錯的記錄和具體原因,方面進一步除錯。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28628435/viewspace-1984384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章