HandleCollisions参数

来源:互联网 发布:玛芬地图软件 编辑:程序博客网 时间:2024/05/05 14:45
作用范围:Replicat
前提条件:使用GG自动初始化的时候用(如果使用RMAN/EXPDP等方式初始化建议不要使用此参数,容易确保数据完整性)
说明:
handlecollisions参数实际工作原理如下:
1).当向目标端更新一条记录的时候(trail记录包含所有列,否则会出现丢失列而abend),如果目标端不存在此where条件中的值则rep将trail中的记录转换为insert插入到目标端;
trail文件中的语句:update test set id=3 where id=2;
目标端ID的值:1、4、5
则trail中的语句转换为:insert into test values(3);
执行完成后ID的值:1、3、4、5

2).当需要更新到目标端的新值已经在目标端存在的时候(trail记录包含所有列),则会删除where条件中对应的值并将trail中的记录覆盖到表中已经存在的新key
trail文件中的语句:update test set id=3,name='XX' where id=2;
执行前表的内容:
IDNAME1ZS2LS3WW
则此参数删除id=2的记录并覆盖id=3的内容,更新后表的内容为:
IDNAME1ZS3XX

3).当完全重复数据在目标端出现的时候,此参数会用trail中的内容覆盖已经存在的数据:

4).当update/delete目标端的记录不存在的时候,如果不影响主键会被discard

特殊情况处理:
1.当目标端数据有误且数据都是NOT NULL,此时handlecollision会因为将update转成insert报错.则此时就需要通过以下方式来确保所有列都写入到trail:
1).使用nocompressupdates参数确保所有列都被写入到trail而不是被压缩的只有主键和被更新的值;
2).FETCHOPTIONS FETCHPKUPDATES,capture会fetch不可用的列,但是可能导致数据不一致;
3).使用handlecollisions _ALLOWPKMISSINGROWCOLLISIONS参数,跳过会转换成insert的update,同样会导致数据不一致

使用方式:
1.启用:参数文件中加入参数handlecollisions
2.禁用:
a).删除handlecollisions参数后重启进程;
b).send replicat nohandlecollisions;
3.不同范围的使用:
Example 1 The following enables HANDLECOLLISIONSfor all MAP statements in the parameter file.
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;

Example 2 The following enables HANDLECOLLISIONSfor some MAP statements while disabling it for
others.
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;

Example 3 The following shows a combination of global and MAP-level use. The MAP specification
overrides the global specification for the specified tables.
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;







0 0