1.問題描述
在備機側,明明有幾條數據同步不成功,但在ggserr.log和discard文件中都沒有顯示。
2.handlecollisions參數的原因
參數的作用:控制replicat進程是否自動處理數據重複或數據丟失的衝突。
parameters to control whether or not Replicat tries to resolve duplicate-record and missing-recorderrors when applying SQL on the target.
3.HANDLECOLLISIONS如何工作
分了3種情況:
- 如果是keycols更新:
1)如果舊主鍵不在目標表:則update轉換成insert
2)如果新主鍵已在目標表:先刪除舊主鍵的記錄,然後覆蓋新主鍵的記錄。(舊主鍵的在源端已不存在,所以刪除;新主鍵的記錄,可以當做update) - 如果是主鍵(或keycols)重複錯誤:
用trail的記錄覆蓋目標表記錄。 - 如果是找不到記錄的錯誤:
如update、delete,丟棄,但不反映在discard文件中。
可以看出來,handlecollisions還是很“體貼”的,考慮了數據不一致的各種情況。
4.用法
1.可以全局使用
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;
2.可以局部使用
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
NOHANDLECOLLISIONS
MAP hr.dep, TARGET hr.dep;
MAP hr.country, TARGET hr.country;
3.可以針對特定的表
HANDLECOLLISIONS
MAP hr.emp, TARGET hr.emp;
MAP hr.job_hist, TARGET hr.job_hist;
MAP hr.dep, TARGET hr.dep, NOHANDLECOLLISIONS;
MAP hr.country, TARGET hr.country, NOHANDLECOLLISIONS;
5.總結下
1.開啓HANDLECOLLISIONS後,OGG會用預設的邏輯處理兩邊數據不一致的情況;如update變insert、或覆蓋等。
2.在初始化同步階段可以使用,因爲靜態同步的數據和trail中可能衝突。
3.正式環境後,應該關閉,讓錯誤暴露出來,方便運維排查。