love wife & love life —Roger的Oracle&MySQL技术博客

Phone:18180207355 提供专业Oracle&MySQL数据恢复、性能优化、迁移升级、紧急救援等服务

goldengate 学习系列8–当主键遇上keycols

本站文章除注明转载外,均为本站原创: 转载自love wife & love life —Roger的Oracle&MySQL技术博客

本文链接地址: goldengate 学习系列8–当主键遇上keycols

—源端主库
说明:
源端数据库:  11.2.0.4   ogg版本12.1.2

目标端数据库:10.2.0.5   ogg版本11.2.1.0.1

—目标端数据库

—-源端进行delete操作

—目标端查询数据

我们可以看到,这里Oracle 默认情况下,并没有对s1表进行删除操作? 为什么?
通过logminer分析源端redo

通过logminer分析目标端redo

既然源端数据库redo已经记录了相关DML的操作,那么ogg是否抓取了呢?

通过logdump分析源端trail文件

从trial文件的dump信息来看,确实是抽取了delete操作. 其中IOType 3表示delete,IOType 5表示insert.表明我们对S1表进行的insert 和delete操作都是被抓取了的。到这里来看,貌似一切都是正常的,但是为什么会出现s1 表数据不同步的情况呢?

对应ogg如果存在异常,那么我们可以查看相关进程的discard文件,内容如下:

很明显,goldengate这里在对s1表进行delete操作的时候,map失败了。因此实际上在目标端针对s1表的delete操作根本就没有执行.

—再次check

这里严格上来讲是keycols参数配置不当导致。 该参数的含义是指制定一个可以表示数据唯一性的列,这样以便于goldengate可以完成同步,例如delete和update.
之前之所以不能同步,报错的原因是因为目标端的s1表 b=1的结果有2条,而原端删除的是一条,很明显是无法进行map的.
下面我们将replicat进程的keycols列修改为a,进行测试发现ok,测试过程如下:

—-原端

—修改目标端replicat配置

—目标端

可以看到,当调整keycols的列之后,一切正常,这是因为目标端s1表的a列的数据本身就是唯一的,因为目前只有2条数据,数值为1,3.  对应不存在主键或unique index的情况之下,如果进行update会导致目标端可能产生重复数据吗?很多人都说ogg 11.2版本不存在这个问题。包括原厂的工程师。稍后将进行相关测试!

Leave a Reply

You must be logged in to post a comment.