Goldengate handlecollisions引起的数据重复

一.背景描述:

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.检查表中是否有主键约束:
select owner,constraint_name,constraint_type,status from dba_constraints where constraint_type='P' and owner='<owner>' and table_name='<table_name>';

确认结果:该表无主键,其他有主键的表也未引起进程abend

3.检查触发器:
select owner,trigger_name,status from dba_triggers where owner='<owner>' where status='ENABLED';

检查结果:发现此owner有个触发器是 通过DDL REPLICAT到目标端的,并且处于enable状态。它会对表cpicing.cc_action_tempprovisional进行update

4.分析参数及触发器:
结合 HandleCollisions参数原理,可见是因为trigger更新了数据,gg去update数据时会出现找不到数据的情况。
则handlecollisions的原理会将update转成insert,则数据就出现了重复的情况。

处理方案:
可以将trigger禁用之后手工清理重复数据或重新初始化。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值