天天看點

了解GoldenGate Replicat的HANDLECOLLISIONS參數

HANDLECOLLISIONS是我們使用goldengate過程中常有的一個REPLICAT參數,該參數依賴于主鍵或唯一索引處理沖突資料,常用于初始化階段。對于無主鍵或唯一索引的表無法處理沖突,且可能導緻重複記錄。注意打開此參數則所有資料錯誤不管reperror如何配置均不再寫discard檔案,即所有資料沖突資訊被預設規則處理,沒有任何日志(則會忽略error mapping資料錯誤,而且不會報告到discard檔案),是以日常複制不建議使用該參數;可予以考慮的特殊場景為隻需新增資料,無需複制曆史資料。   使用HANDLECOLLISIONS的幾個場景:

target丢失delete記錄(missing delete),忽略該問題并不記錄到discardfile

target丢失update記錄(missing update)

更新的鍵值是主鍵=》 update轉換成INSERT ,預設情況下插入記錄不完整

更新的鍵值是非主鍵=》 忽略該問題并不記錄到discardfile

重複插入已存在的主鍵值到target表中,這将被replicat轉換為UPDATE現有主鍵值的行的其他非主鍵列

情景1 target丢失delete記錄(missing delete) :

        情景2 target丢失update記錄(missing update),更新的鍵值是主鍵 :    

      這裡出現T1=5 T2 NULL記錄的原因是 ,丢失update的更新操作是針對主鍵的更新,此時replicat會嘗試插入一條記錄而非忽略該update。 注意插入的記錄可能不是完整的行,如上例中的T2 為NULL ,若要求完整的行記錄則要求EXTRACT使用PKUPDATE選項。 需要加入的選項是FETCHOPTIONS FETCHPKUPDATECOLS 将以上選項加入到EXTRACT參數檔案中,并重新開機EXTRACT。 這将引起extract捕獲完整的主鍵更新鏡像。 如以下的例子:

      如上述實驗驗證FETCHOPTIONS FETCHPKUPDATECOLS将捕獲完整的redo image鏡像到trail中,這保證把primary key的更新通過HANDLECOLLISIONS轉換為對target的一個完整記錄的插入。   情景3 重複插入已存在的主鍵值到target表中,這将被replicat轉換為UPDATE現有主鍵值的行的其他非主鍵列:      

    總結   HANDLECOLLISIONS是我們使用goldengate過程中常有的一個REPLICAT參數,該參數依賴于主鍵或唯一索引處理沖突資料,常用于初始化階段。對于無主鍵或唯一索引的表無法處理沖突,且可能導緻重複記錄。注意打開此參數則所有資料錯誤不管reperror如何配置均不再寫discard檔案,即所有資料沖突資訊被預設規則處理,沒有任何日志,是以日常複制不建議使用該參數;可予以考慮的特殊場景為隻需新增資料,無需複制曆史資料。   使用HANDLECOLLISIONS的幾個場景:

另:該參數僅處理資料本身的Insert/Delete沖突,如果出現兩端映射或其它結構性問題Replicat程序依然會abend,不能被忽略   此外對于主鍵的更新操作,若在target使用HANDLECOLLISIONS且該update丢失,在會轉換為INSERT該主鍵的操作,注意預設情況下插入的記錄不完整,FETCHOPTIONS FETCHPKUPDATECOLS将捕獲完整的redo image鏡像到trail中,這保證把primary key的更新通過HANDLECOLLISIONS轉換為對target的一個完整記錄的插入。     我們可以通過send 指令動态取消HANDLECOLLISIONS

REP2 NOHANDLECOLLISIONS set for 1 tables and 0 wildcard entries

本文轉自maclean_007 51CTO部落格,原文連結:

http://blog.51cto.com/maclean/1278456