OGG 跳过报错事务
环境介绍:
OS:redhet 5.6
Database:11.2.0.1
Host name (ip): source 192.168.1.20
target 192.168.1.40
SID: 192.168.1.20 tests
192.168.1.40 testt
故障模拟:
当前OGG支持DDL模式,进程中配置的和前几篇文章一样是Test.*。
现在target 端创建一个test表。
我们再向source端创建一个test表
并且向表内插入一条数据。(注意想要模拟这个实验,插入数据这一步会很重要)
这个时候我们观察进程的状态,我们会发现target端的replicat进程会因此ABENDED,我们多次启动,仍然是ABENDED,现在的问题就是我这个报错卡在这过不去了,当然我要是删掉target端的test.test表再启动,肯定是可以起来的,但是在生产上,如果我的表现在就是有数据的,我这部分数据还不能丢,那这个情况我们就不能再使用删表的这种方法了。
解决方法:
怎么都起不来,现在我们使用ogg的logdump工具去跳过这个错误的事务,具体解决方法如下:
我们先看下这个当前Replicat进程应用到了哪个队列,哪个RBA的时候出了错。
我们发现是/dirdat/tt000004队列,RBA 3949号出了问题。
我们进入logdump定位,并且跳过错误的事务:
打开tt000004文件,从RBA为0的那个位置开始显示
n表示next,我们发现在3949后面还有一个insert的操做,RBA为5283。n到最后已经没有显示了,证明记录就到此为止。
之后我们在GGSCI当中设置进程的RBA号为5238,启动进程。
当前target端的replicat进程的RBA从3949跳到了5283。
启动进程。start repntt
这时这个进程已经能正常启动了。
我们查看一下target数据
这条数据已经过来了;
注意:
这一点其实就是我们一直说的,支持DDL同步的OGG问题经常会很多,而且很奇怪,维护起来会十分头疼,有各种各样的报错产生,会经常导致同步停止。我在生产上见过的真是不多。
扩展:
这种方法是通过定位RBA号去跳过报错信息的,我这里说一下啥叫做RBA号:
RBA号和SCN号是经常出现的两个名字,我们都知道SCN号叫系统更改号,英文全拼(SYSTEM CHANGE NUMBER), 这个值是不断的刷新在数据文件,控制文件,redo文件当中,从而保证数据的一致性的号码。而这里我们说到的RBA,叫做重做块地址,英文全拼是(REDO BLOCK ADDRESS),其作用就是在数据库实例恢复的时候,在日志当中记录从哪个点开始恢复,这个值也会向控制文件当中记录,就像我们实验当中体现的那样,我们可以通过队列当中记录的RBA号,跳过出问题的阶段,从而继续让数据库工作。
当然还有种方法是通过更改ogg replicat进程的配置将报错号写入进程配置当中。忽略掉数据库报错,从而使得进程不Abend,这种方法一般使用的时候都是有预知性的。方法就是在进程当中配置:
DDLERROR ( 1430,discard)
1430就是以ORA-开头的报错号,将这个报错放到了discard文件当中,然后一旦下次遇到这种报错,就不会导致进程abend,虽然效果差不多,但是使用的情况不同,这里忽略实验,只是简单的提一下下。
THAT'S ALL
BY CUI PEACE!!!!!!
本文分享自微信公众号 - 最帅dba工作笔记,如有侵权,请联系 service001@enmotech.com 删除。