skip a transaction in goldengate

用OGG做两个ORACLE OLTP数据库的A-A同步含DDL,刚发现Replicat进程ABENDING了,下面分析一下原因

ggserr.log日志

在日志中能看出大概SQL,我的replicat group配置文件配置了DiscardFile 记录了image

看到这个sql,我确认了修改内容,问了下同事果然是失误操作,修改了学员卡号,而那个卡号上是有trigger,会级连修改好多相关表,而且有外键约束,但从库上的trigger是disable的,所以就遇到了外键约束导致备库更新失败,不过后来同事又修改回来了,数据上在主库是还原了的,那我可以来跳过此事务

首先先找到replicat进程当前应用到的rba,也就是csn(commit sequence number),在oracle中的scn,来定位下次应用的起始RBA,它就是在trail文件中下一次replicat 进程将要fseek() call 并起动进程的位置(actual byte position )

通过上面的信息我们知道了replicat进程ricme group 下在应用到了dirdat/l2000040的RBA 84509907,我们想跳过这个事务应用下一条记录就可以,但是可不是简单的在当前的RBA上加1,RBA必须是有OGG格式过的,如果输入的是无效地址启动后EXCEPTION会记录到ggserr.log中,我们可以用OGG安装目录下的logdump工具来定位下一条记录的“真正”位置

pos是position的缩写,意思是定位到replicat启始的位置,n是next的缩写,第一个n定位显示出当前应用的记录,可以看出是update 还有表的名字,还有image的值,我们要跳过这个事务当然要再输一个n,可以看到下一个记录的rba是 84510103绝不是前面RBA简单的加1.这样我们就可以修改replicat进程启动时的rba指定为84510103

当然如果还有失败的事务还可以继续next用上面的方法,不过如果有几个连续的事务需要skip,那就可以用另外一个方法

不过跳过的事务数是未知的,同样也会记录到discard文件中,如果参数中配置了。

此条目发表在Oracle分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注