OGG的REP程序對主鍵列加1的處理
本文是轉載,原文作者震總,他是Oracle database, OGG,HVR方面的資深工程師。
問題說明
對於表的主鍵列進行更新時,如果更新語句為set x=x+n或者更新過程中涉及到主鍵值的偏移,這種事務在源端可以正常執行,因為更新操作是在同一個語句中完成的。而對於HVR目標端來說,可能會把源端的一個更新語句轉換為多個更新語句如:
目標端在執行上面的語句時會觸發主鍵約束而報錯:
ORA-00001: unique constraint (WZTEST.SYS_C005212) violated
Goldengate處理方式
在Oracle 11.2.0.2之前可以使用HANDLETPKUPDATE引數來解決,報錯問題。
不過這個引數的使用有一個限制條件,就是對應表的主鍵要修改成deferrable狀態。
altertableWZTEST.TB
dropconstraintSYS_C005213cascade;
altertableWZTEST.TB
addprimarykey(ID)
deferrable;
這只是一種臨時的解決辦法,當主鍵表太多時就不太適用了。
引數HANDLETPKUPDATE的使用方式
replicat reppart
setenv ( NLS_LANG = "AMERICAN_AMERICA.ZHS16GBK" )
assumetargetdefs
userid goldengate, password oracleoracle
DBOPTIONS DEFERREFCONST, SUPPRESSTRIGGERS
gettruncates
ALLOWNOOPUPDATES
ddl include mapped
discardfile ./dirrpt/reppart.dsc, purge, megabytes 5000
MAP WZTEST.*, target WZTEST.*, HANDLETPKUPDATE;
通過10046跟蹤可以得到goldengate應用程序在執行對pk的update前後會執行下面的兩個語句。執行更新操作前它會把constraint設定為deferred狀態,更新完成之後,再設定成
alter session set constraint = deferred
UPDATE /*+ RESTRICT_ALL_REF_CONS */ "WZTEST"."TB" SET "ID" = :a1 WHERE "ID" = :b0 AND rowid <> :rid
alter session set constraint = immediate
Oracle 11.2.0.3中的處理方式
Oracle11.2.0.3中的儲存過程DBMS_XSTREAM_GG.ENABLE_TDUP_WORKSPACE可以解決這個問題,使用這個儲存過程不再需要對錶的主鍵狀態進行修改,也不需要在Goldengate的引數檔案中使用handletpkupdate引數。
這個儲存過程是資料庫自帶的,即使沒有部署Goldengate 資料庫中也有這個儲存過程。
通過10046可以看到goldengate的應用程序中顯示了呼叫了dbms_xstream_gg.enable_tdup_workspace和dbms_xstream_gg.disable_tdup_workspace兩個儲存過程。
begin dbms_xstream_gg.enable_tdup_workspace; end;
update …
begin dbms_xstream_gg.disable_tdup_workspace; end;
這兩個儲存過程在資料庫中是加密的,具體的實現,不得而知。
參考文件:
GoldenGate REPLICAT abend ORA-00001: unique constraint violated on transient PKUpdate in 11.2.0.4 (Doc ID 1928263.1)
Usage of Handletpkupdate requires specific defer settings on table (Doc ID 1303231.1)
Oracle® GoldenGate Windows and UNIX Reference Guide 11g Release 2 Patch Set 1 (11.2.1.0.1)