OGG同步複製時與相容觸發器解決方法

jichengjie發表於2018-04-15
     搭建OGG時,一般都會disable trigger。有時候,由於特定原因,除了同步資料,還需要在目標庫上進行業務操作,而觸發器又實現了很多業務邏輯,這時候,就不能採用
alter trigger tr_dept disable的方式直接遮蔽了。但是,enable的話又可能會造成資料的問題,比如,觸發器中操作某個表,但是其實那個表已經透過OGG進行了同步,這樣,就會造成重複運算元據,
進而導致資料與主庫不一致。
    我們的實施要求,OGG同步一些業務資料到目標庫,同時目標庫上觸發器不能停(我們ERP系統很多業務邏輯是在觸發器中實現的),因客戶要在目標庫上進行某些業務。
    可能的解決方案(這裡以scott這個schema為例, OGG的搭建過程省略):
   
1. 觸發器程式碼:

點選(此處)摺疊或開啟

  1. CREATE OR REPLACE TRIGGER tr_dept
  2.   BEFORE INSERT OR UPDATE ON dept
  3.   FOR EACH ROW
  4. DECLARE
  5.   v_ind PLS_INTEGER;
  6. BEGIN
  7.   SELECT COUNT(*)
  8.     INTO v_ind
  9.     FROM tmp_disable_trigger
  10.    WHERE table_name = 'dept';

  11.   IF v_ind > 0 THEN
  12.     RETURN;
  13.   END IF;

  14.   INSERT INTO dept_log (id, dt) VALUES (seq_dept_log.nextval, SYSDATE);
  15. END;
其中tmp_disable_trigger是個事務級全域性臨時表,相當於做了個開關, insert dept_log相當於額外的業務邏輯。

點選(此處)摺疊或開啟

  1. create global temporary table tmp_disable_trigger(
  2.  table_name varchar2(100)
  3. ) on commit delete rows;
2. 修改目標端複製程式引數, 關鍵字sqlexec
GGSCI55> view params r_oggdb
replicat r_oggdb
SETENV (ORACLE_SID = "oggdb")
userid ggs,password ggs
assumetargetdefs
reperror default,discard
discardfile ./dirrpt/r_oggdb.dsc,append,megabytes 50
dynamicresolution
MAP scott.*, target scott.*, SQLEXEC (SPNAME scott.sp_disable_trigger, ID sp_disable_trigger, PARAMS (p_tablename = 'dept'));


經測試,在進行scott.dept表同步時,不會向dept_log中插入新的資料。這裡,觸發器就被邏輯上繞過了(實際上還是要觸發,只是不執行觸發器中的程式碼了)

需要注意的是,如果是有多個地方要執行相同的過程,需要指定ID, 不同行的ID不能相同,例:
MAP scott.dept, target scott.dept, SQLEXEC (SPNAME scott.sp_disable_trigger, ID sp_disable_trigger1, PARAMS (p_tablename = 'dept'));
MAP scott.emp, target scott.empSQLEXEC (SPNAME scott.sp_disable_trigger, ID sp_disable_trigger2, PARAMS (p_tablename = 'dept'));

否則可能會有如下錯誤:
2017-06-13 11:23:30  ERROR   OGG-00303  Oracle GoldenGate Delivery for Oracle, R_ERP_FY.prm:  Duplicate stored procedure name (scott.sp_disable_trigger)


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

相關文章