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中斷恢復!