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 併發複製程式自阻塞
- 批量更新時無法觸發事件的解決方法事件
- OGG DDL觸發器引發的故障系列(一)觸發器
- OGG複製同步,提示欄位長度不夠ORA-01704
- ORACLE(Linux版本)實時同步資料到MYSQL(Linux版本)解決方案:OGGOracleLinuxMySql
- mysql同步(複製)延遲的原因及解決方案MySql
- OGG雙向條件複製的部署與測試
- OGG複製程式延遲高,優化方法一(使用索引)優化索引
- Mysql 非同步複製延遲的原因及解決方案MySql非同步
- virtualbox與win10不相容怎麼解決 virtualbox與win10不相容的解決方法Win10
- 複製貼上不了怎麼辦?Mac複製貼上不瞭解決方法Mac
- 遠端伺服器不能複製貼上解決方法伺服器
- mysql主從複製配置與問題解決MySql
- NTP時間同步伺服器(區域網時鐘同步)解決方案伺服器
- MySQL 8 複製(一)——非同步複製MySql非同步
- MySQL 8 複製(二)——半同步複製MySql
- 高階複製錯誤ORA-23474解決方法
- win10 將檔案複製到ftp伺服器時發生錯誤怎麼解決Win10FTP伺服器
- OGG classic模式maxtransops引數提升複製效率模式
- MySQL主從複製之半同步複製MySql
- MySQL主從複製之非同步複製MySql非同步
- 連線 MySQL 8.0 時,加密方式不相容的解決方法MySql加密
- 使用nodeAPI時遇到非同步問題的解決方法API非同步
- 主流瀏覽器相容性問題與解決方案瀏覽器
- 解決Kali LinuxVI編輯器無法複製問題Linux
- OGG_mysql 12c複製到OGG_oracle 11g部署方案MySqlOracle
- OGG 12c mysql複製到oracle部署方案MySqlOracle
- OGG-01705解決思路
- mysql 5.7半同步複製MySql
- MySQL5.7主從複製-半同步複製搭建MySql
- ogg 同步kafka OGG-15051 Java or JNI exception:KafkaJavaException
- SQL Server:觸發器詳解SQLServer觸發器
- 淺複製與深複製
- MySQL 高階 | 用儲存過程、定時器、觸發器來解決資料分析問題MySql儲存過程定時器觸發器
- MySQL 傳統複製與 GTID 複製原理及操作詳解MySql
- ogg複製程式報ORA-01438錯誤處理
- MySQL 主從複製,常見的binlog錯誤及解決方法MySql
- 電腦無法複製貼上怎麼回事?電腦無法複製貼上的解決方法