GoldenGate HANDLECOLLISIONS參數使用說明

HANDLECOLLISIONS在官方文檔上的說明:運維

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

事實是, HANDLECOLLISIONS 常常被爛用。爲了省事,許多運維人員,常常在目標端投遞出問題時,直接在目標端進程上配置 HANDLECOLLISIONS,而後進程就會啓動並繼續執行,但這樣作只會掩蓋問題,而且隨着時間的遷移,問題越積越深,最終發現目標端的數據與源端相差很遠。spa

因此 HANDLECOLLISIONS 根據官方的建議,通常只應該用在初始化階段的replicat進程。若是在其它時候使用 HANDLECOLLISIONS,這是很是不明智的作法,由於極有可能會形成數據不一致。日誌

若是有這種狀況,應該當即中止投遞進程並刪除HANDLECOLLISIONS參數,而後對源和目標端的數據進行對比後從新同步。orm

 

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

1.HANDLECOLLISIONS 只在有PK或惟一索引的表上有效,若是是沒有惟一鍵的表,則可能形成重複記錄。隊列

2.在抽取進程使用LOGALLSUPCOLS參數,並針對表打開全字段附加日誌,若是沒有這樣設置,當 HANDLECOLLISIONS update操做轉換爲insert操做時,可能會報ORA-1403錯誤。進程

3.若是表上有LOB字段,且存的內容超過緩衝區域(2 kb4 kb)的大小,則 HANDLECOLLISIONS 會排除此LOB字段的處理,因此,若是有表包含有lob字段,且長度超過2Kb,則不該該使用 HANDLECOLLISIONS事務

 

因此, HANDLECOLLISIONS 最好是在初始化時使用,且初始化追平以後就應該中止使用。下面基於一個示例來說解:ci

若是在下午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進程中刪除。

相關文章
相關標籤/搜索