OGG同步複製時與相容觸發器解決方法
搭建OGG時,一般都會disable trigger。有時候,由於特定原因,除了同步資料,還需要在目標庫上進行業務操作,而觸發器又實現了很多業務邏輯,這時候,就不能採用
alter trigger tr_dept disable的方式直接遮蔽了。但是,enable的話又可能會造成資料的問題,比如,觸發器中操作某個表,但是其實那個表已經透過OGG進行了同步,這樣,就會造成重複運算元據,
進而導致資料與主庫不一致。
我們的實施要求,OGG同步一些業務資料到目標庫,同時目標庫上觸發器不能停(我們ERP系統很多業務邏輯是在觸發器中實現的),因客戶要在目標庫上進行某些業務。
可能的解決方案(這裡以scott這個schema為例, OGG的搭建過程省略):
1. 觸發器程式碼:
其中tmp_disable_trigger是個事務級全域性臨時表,相當於做了個開關, insert dept_log相當於額外的業務邏輯。
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.emp, SQLEXEC (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)
alter trigger tr_dept disable的方式直接遮蔽了。但是,enable的話又可能會造成資料的問題,比如,觸發器中操作某個表,但是其實那個表已經透過OGG進行了同步,這樣,就會造成重複運算元據,
進而導致資料與主庫不一致。
我們的實施要求,OGG同步一些業務資料到目標庫,同時目標庫上觸發器不能停(我們ERP系統很多業務邏輯是在觸發器中實現的),因客戶要在目標庫上進行某些業務。
可能的解決方案(這裡以scott這個schema為例, OGG的搭建過程省略):
1. 觸發器程式碼:
點選(此處)摺疊或開啟
-
CREATE OR REPLACE TRIGGER tr_dept
-
BEFORE INSERT OR UPDATE ON dept
-
FOR EACH ROW
-
DECLARE
-
v_ind PLS_INTEGER;
-
BEGIN
-
SELECT COUNT(*)
-
INTO v_ind
-
FROM tmp_disable_trigger
-
WHERE table_name = 'dept';
-
-
IF v_ind > 0 THEN
-
RETURN;
-
END IF;
-
-
INSERT INTO dept_log (id, dt) VALUES (seq_dept_log.nextval, SYSDATE);
- END;
點選(此處)摺疊或開啟
-
create global temporary table tmp_disable_trigger(
-
table_name varchar2(100)
- ) on commit delete rows;
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.emp, SQLEXEC (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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 配置OGG到MYSQL複製時登陸MYSQL報錯解決MySql
- 批量更新時無法觸發事件的解決方法事件
- ogg 併發複製程式自阻塞
- oracle 觸發器-表同步Oracle觸發器
- oralce觸發器解決問題觸發器
- OGG 複製程式拆分
- 透過觸發器複製包含LONG型別的表觸發器型別
- mysql同步(複製)延遲的原因及解決方案MySql
- OGG複製與加密欄位的衝突加密
- MySQL的主從複製、半同步複製、主主複製詳解MySql
- 【MySQL】半同步與增強半同步複製MySql
- [原創] 有關觸發器 ORA-04091解決方法觸發器
- 複製文件有亂碼的解決方法!
- Mysql 非同步複製延遲的原因及解決方案MySql非同步
- MySQL的非同步複製和半同步複製MySql非同步
- Windows 7 複製檔案慢的解決方法Windows
- OGG複製同步,提示欄位長度不夠ORA-01704
- Oracle觸發器死鎖問題解決Oracle觸發器
- OGG雙向DML複製操作
- OGG單向DDL複製操作
- 遠端伺服器不能複製貼上解決方法伺服器
- 複製貼上不了怎麼辦?Mac複製貼上不瞭解決方法Mac
- NTP時間同步伺服器(區域網時鐘同步)解決方案伺服器
- 觸發器詳解觸發器
- mysql主從複製配置與問題解決MySql
- MySQL 8 複製(一)——非同步複製MySql非同步
- MySQL 8 複製(二)——半同步複製MySql
- OGG複製程式延遲高,優化方法一(使用索引)優化索引
- 解決css瀏覽器不相容萬能方法CSS瀏覽器
- MySQL 常見同步複製故障處理方法MySql
- win10 將檔案複製到ftp伺服器時發生錯誤怎麼解決Win10FTP伺服器
- ORACLE(Linux版本)實時同步資料到MYSQL(Linux版本)解決方案:OGGOracleLinuxMySql
- IBM實時資料複製和同步解決方案 and IBM CDC ORACLE GOLDEN GATE 比較IBMOracleGo
- MySQL主從複製、半同步複製和主主複製MySql
- MySQL主從複製之半同步複製MySql
- MySQL主從複製之非同步複製MySql非同步
- MySQL 半同步複製MySql
- MySQL半同步複製MySql