一.背景描述:
20140926客户工程师反馈在goldengate的目标数据库执行以下语句有重复记录出现:
select * from cpicing.cc_action_tempprovisional a where a.policy_no||a.policy_seq = '280020719642'
检查Replicat进程目标端参数:
REPLICAT repcpic_c setenv (ORACLE_SID=chaxun) setenv (NLS_LANG="AMERICAN_AMERICA.ZHS16GBK") USERID ogg, PASSWORD ogg reportcount every 30 minutes,rate ASSUMETARGETDEFS numfiles 5000 --dboptions allowunusedcolumn maxtransops 50000 grouptransops 10000 checkpointsecs 40 handlecollisions //此参数控制OGG自动处理数据冲突(collision)</span> discardfile ./dirrpt/cpic.dsc,append,megabytes 1000 gettruncates allownoopupdates DDLERROR 24344,ignore DDLERROR 1756,ignore --DDLERROR 1439,ignore DDL INCLUDE ALL --DDLERROR DEFAULT IGNORE RETRYOP map cpicing.*, target cpicing.*;
二.问题分析:
1.通过执行以下语句检查获取是否有重复记录:
select count(1) from <table_name>; //获取所有数据记录 select count(1) from (select distinct * from <table_name>); //获取非重复记录
确认结果:查询二所得的结果比查询一少了4W多条记录,也就是说有重复数据
2.检查表中是否有主键约束:
3.检查触发器:select owner,constraint_name,constraint_type,status from dba_constraints where constraint_type='P' and owner='<owner>' and table_name='<table_name>';
确认结果:该表无主键,其他有主键的表也未引起进程abend
select owner,trigger_name,status from dba_triggers where owner='<owner>' where status='ENABLED';
检查结果:发现此owner有个触发器是 通过DDL REPLICAT到目标端的,并且处于enable状态。它会对表cpicing.cc_action_tempprovisional进行update4.分析参数及触发器:
结合 HandleCollisions参数原理,可见是因为trigger更新了数据,gg去update数据时会出现找不到数据的情况。则handlecollisions的原理会将update转成insert,则数据就出现了重复的情况。
处理方案:
可以将trigger禁用之后手工清理重复数据或重新初始化。