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中断恢复!