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.正式环境后,应该关闭,让错误暴露出来,方便运维排查。