GoldenGate HANDLECOLLISIONS引數使用說明

margiex發表於2018-05-27

HANDLECOLLISIONS在官方文件上的說明:

使用HANDLECOLLISIONSNOHANDLECOLLISIONS引數來控制在目標上應用SQL時,Replicat是否嘗試解決重複記錄和缺少記錄的錯誤。

事實是, HANDLECOLLISIONS 經常被爛用。為了省事,許多運維人員,經常在目標端投遞出問題時,直接在目標端程式上配置 HANDLECOLLISIONS,然後程式就會啟動並繼續執行,但這樣做只會掩蓋問題,並且隨著時間的遷移,問題越積越深,最終發現目標端的資料與源端相差很遠。

所以 HANDLECOLLISIONS 根據官方的建議,一般只應該用在初始化階段的replicat程式。如果在其它時候使用 HANDLECOLLISIONS,這是非常不明智的做法,因為極有可能會造成資料不一致。

如果有這種情況,應該立即停止投遞程式並刪除HANDLECOLLISIONS引數,然後對源和目標端的資料進行對比後重新同步。

 

要使用 HANDLECOLLISIONS,還需要在源端程式和表的附加日誌上做些工作,包括:

1.HANDLECOLLISIONS 只在有PK或唯一索引的表上有效,如果是沒有唯一鍵的表,則可能造成重複記錄。

2.在抽取程式使用LOGALLSUPCOLS引數,並針對表開啟全欄位附加日誌,如果沒有這樣設定,當 HANDLECOLLISIONS update操作轉換為insert操作時,可能會報ORA-1403錯誤。

3.如果表上有LOB欄位,且存的內容超過緩衝區域(2 kb4 kb)的大小,則 HANDLECOLLISIONS 會排除此LOB欄位的處理,所以,如果有表包含有lob欄位,且長度超過2Kb,則不應該使用 HANDLECOLLISIONS

 

所以, HANDLECOLLISIONS 最好是在初始化時使用,且初始化追平之後就應該停止使用。下面基於一個示例來講解:

如果在下午1點啟動抽取程式,2點的時候,在確保沒有1點之前開始且到2點還沒有結束的事務,此時,使用SourceIsTable進行初始化。在初始化的過程中,系統上一般會有資料變化。

下午3點的時候初始化完成,現在在目標端使用 HANDLECOLLISIONS 引數,啟動投遞程式。此時,投遞程式會從佇列檔案(增量資料)最開始的地方(1點)開始應用資料到目標端DB,理論上1-2點之間變化的資料在OGG增量資料和初始化資料中都有包含。比如,有人在115開始一個事務,130才結束,在OGGextract增量資料及initial load中都會包含這個交易的資料。此時,因為有使用 HANDLECOLLISIONS ,所以replicat會根據衝突處理機制,自動處理這些重複資料,確保目標端資料一致。

一旦目標端replicat程式處理到初始化結束的時間點,即3點,則應該立即使用 SEND REPLICAT NOHANDLECOLLISIONS 去掉自動衝突解決機制,並將 HANDLECOLLISIONS 引數從replicat程式中刪除。

相關文章