1. 程式人生 > >OGG的REP程序對主鍵列加1的處理

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應用程序在執行對pkupdate前後會執行下面的兩個語句。執行更新操作前它會把constraint設定為deferred狀態,更新完成之後,再設定成

immediate狀態。

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_workspacedbms_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)