OGG应用复制进程报错OGG 01161

OGG 应用进程abend,通过report abend_process_name可以发现如下报错信息

ERROR   OGG-01161  Bad column index (15) specified for table UPCENTER.STK_LIST, max columns = 15.

1.目标端,查询报错进程参数,目标端,源端表名称

ggsci> info all;
view param abend_process_name;
可以发现存在def文件,此文件一般是异构环境才存在的!
sourcedefs /home/oracle/ogg/dirdef/123_666.def map source.a ,target target.b;

源端查询表结构

SQL>desc UPCENTER.STK_LIST
只有15个列

2.源端,查询同步报错的表信息

运维的环境有OGG拓扑图,因此很快定位找到源端OGG环境
通过ggsci>info all
查询确认 e_xxx,r_xxx找到抽取进程,投递进程后

SQL>desc source.a  发现!列是16个,而并非目标端15个列,并且源端目标端并未使用col列指定参数,因此默认是所有列同步的。
本次问题得到了,源端新增一个列,导致目标端ogg应用进程abend
解决方法:目标端手工添加一个字段!并且源端重新配置报错表的def文件!

确认新增字段无默认值
SQL> select DATA_DEFAULT,TABLE_NAME,COLUMN_NAME from USER_TAB_COLUMNS where table_name='DDD';

3.目标端新增字段

1)确认表无dml操作
SQL>select object_id from dba_objects where owner='xx' and object_name='xx';
SQL>select type,id1,id2,lmode,request from gv$lock where id1=object_id;
确认无TM 3号锁之后或者更高级别的锁之后,添加字段。
2)添加字段
SQL>alter table owner.table_name add uxx varchar2(32 char);
--如果有default 则加上 default 'x';
3)启动abend进程
GGSCI> start abend_process;
报错
提示def文件列还是只有15列!

4.源端创建新的def文件,目标端更新def文件使用最新的

说明,本次只有1个表存在问题,因此流程是源端对单个表创建def文件后,将此表信息复制后,在目标端def文件编辑更新这个表的def记录。
如果存在多个表有问题,最简单的是源端所有抽取的表创建def文件,目标端直接替换def文件该名。

源端:创建问题表最新def文件
$cd /u01/app/ogg/base/dirdef
$vi source_a_bc.prm
defsfile ./dirdef/source_a_bc.def,purge
USERID goldengate ,password oracle
table source.table_name;

/u01/app/ogg$./defgen paramfile /u01/app/ogg/base/dirdef/source_a_bc.prm

$cat ./dirdef/source_a_bc.def
*
Definition for table source.table_name
Record length :1356
Syskey:0
Columns:16
column_name1 xx
column_name 2 xxx
End of definition 

上述* => END 整体复制

5.目标端更新def文件

!如果应用进程,复制进程无DEF参数,说明不需要配置这个。异构环境添加表字段后,还需要参考def文件才能进行ogg同步!
ggsci>info abend_process_name
参数 defsfile  ./······
备份:cp xxx xxx.bak
编辑 vi xxx 将上述备份的进行替换
*
Definition for table source.table_name
Record length :1356
Syskey:0
Columns:16
column_name1 xx
column_name 2 xxx End of definition 上述* => END 整体复制
启动abend_process 后,OGG中断恢复!

你可能感兴趣的:(OGG应用复制进程报错OGG 01161)