ORACLE OGG 异常处理 之 单表重新初始化 基于SCN修复
某天突然接到客户电话:丁工,我们OGG应用进程挂掉了,快帮我们处理一下,目标端有应用在使用的!不要慌,让我先查看查看原因。登录上一查看报错,原来是我的老朋友了:OGG-01296 Error mapping from . to .。
相信熟悉OGG的朋友都没少遇见过这个报错,这个报错可能的原因主要有以下几种:
1. OGG源端目标端表数据不一致。
2. OGG挖掘到的数据缺少主键无法应用。
此次客户遇到的情况就是由于两端数据库表数据不一致所导致的。此类问题有一个通用的解决方法,那就是重新初始化出现问题的表。
初始化单张表一般有两种方法:
单表初始化方法一
第一种:我们可以通过查询应用进程报错停止时的scn号。从源端导出数据导入到目标端。
1.查找scn号
2.根据scn号导出导入对应表数据。
expdp “‘”/ as sysdba”‘” directory=DUMPDIR tables=dxy.test1 dumpfile=ogg.dmp logfile=ogg_exp.log flashback_scn=5633566388758 exclude=job,trigger
impdp “‘”/ as sysdba”‘” directory=DPUMPDIR tables=dxy.test1 dumpfile=ogg.dmp logfile=ogg_imp.log
3.开启应用进程。
此方法无需改动原有OGG进程,方便快捷,但是缺点在于在完成出错表初始化之前,其他表也无法继续应用下去,如果表数据量较小的情况下,比较推荐此方法。
单表初始化方法二
第二种:我们可以通过从源端任意scn号处导出,导入目标端后,让应用进程从相应的scn号开始应用。
1. 从进程中排除出错的表,使其他表现应用起来不受影响。
2. 源端查询scn号,初始化导出报错表。
expdp “‘”/ as sysdba”‘” directory=DUMPDIR tables=dxy.test1 dumpfile=ogg.dmp logfile=ogg_exp.log flashback_scn=161244 exclude=job,trigger
3.导入数据后,新建OGG应用进程。
impdp “‘”/ as sysdba”‘” directory=DPUMPDIR tables=dxy.test1 dumpfile=ogg.dmp logfile=ogg_imp.log
新建OGG进程,根据scn号启动应用进程
start ogg_rep atscn 161244
至此该表即可正常同步
此方法不会影响其他表格的数据更新,比较适用于出错表数据量比较大或者OGG目标端对数据实时性要求较高的场景。
由于此次客户目标端有应用在运行,对数据实时性要求较高,所以斟酌之下我选择了第二种方法帮助客户重新初始化了出错的表。