近来计量中心项目管理测试环境GoldenGate同步配置针对部分表的同步持续不断地报OGG-01163错误,导致涉及部分表同步的所有Replicat进程Abended,使GoldenGate停止工作。出现该问题的Table的结构完全一致,出现问题后,无法正常启动Replicat进程。
实际环境的GoldenGate报错信息如下:
HX_DJ.DJ_DJHZDYLBSZ表
Usingthe following key columns for targettableHX_DJ.DJ_DJHZDYLBSZ: LB_DM.
SourceContext :
SourceModule:[ggstd.conv.endian]
SourceID:[/scratch/aime1/adestore/views/aime1_staxk11/oggcore/OpenSys/src/gglib/ggstd/lecnv.c]
SourceFunction:[convCompSQL(char*, file_def *,rowlen_t)]
SourceLine:[591]
2012-10-2510:05:08 ERROR OGG-01163 Bad column length (13) specified forcolumnLRR_DM in tableHX_DJ.DJ_DJHZDYLBSZ, maximum allowable length is11.
HX_RD.RD_YBNSRFDQGL_RDB表
Usingthe following key columns for targettableHX_RD.RD_YBNSRFDQGL_RDB:RDPZUUID.
SourceContext :
SourceModule:[ggstd.conv.endian]
SourceID[/scratch/aime1/adestore/views/aime1_staxj16/oggcore/OpenSys/src/gglib/ggstd/lecnv.c]
SourceFunction:[convCompSQL(char*, file_def *,rowlen_t)]
SourceLine:[591]
2012-10-2609:17:06 ERROR OGG-01163 Bad column length (7) specified forcolumnSJGSDQ in tableHX_RD.RD_YBNSRFDQGL_RDB, maximum
allowablelength is 5.
HX_RD.RD_NSSBFSRDJBGB表
Usingthe following key columns for targettableHX_RD.RD_NSSBFSRDJBGB:RDPZUUID.
SourceContext :
SourceModule:[ggstd.conv.endian]
SourceID:[/scratch/aime1/adestore/views/aime1_staxk11/oggcore/OpenSys/src/gglib/ggstd/lecnv.c]
SourceFunction:[convCompSQL(char*, file_def *,rowlen_t)]
SourceLine:[591]
2012-10-2609:39:35 ERROR OGG-01163 Bad column length (7) specified forcolumnSJGSDQ in tableHX_RD.RD_NSSBFSRDJBGB, maximumal
lowablelength is 5.
HX_ZSJ.T_XT_HCBXX表
Usingthe following key columns for targettableHX_ZSJ.T_XT_HCBXX:TABLE_NAME.
SourceContext :
SourceModule:[ggstd.conv.endian]
SourceID:[/scratch/aime1/adestore/views/aime1_staxk11/oggcore/OpenSys/src/gglib/ggstd/lecnv.c]
SourceFunction:[convCompSQL(char*, file_def *,rowlen_t)]
SourceLine:[591]
2012-10-1623:49:10 ERROR OGG-01163 Bad column length (3) specified forcolumnQUERY_FROM_DB in tableHX_ZSJ.T_XT_HCBXX, maximum allowablelength is 1.
我们针对上述问题所涉及的表及相应字段分析发现,出现问题的进程的Source和Target两端表的结构完全一致,并不符合OGG-01163错误所描述的那样两端的字段长度不一致。
但是这些出现问题的表字段具有一个共性:都是char类型。
SQL>desc HX_RD.RD_NSSBFSRDJBGB
Name Type Nullable DefaultComments
…
SJGSDQ CHAR2(5) '00000' 数据归属地区
SQL>desc HX_FP.FP_KFYJXX
Name Type Nullable DefaultComments
--------------------- -------------------------------------------------------------------
.....
SJGSDQ CHAR(5) '00000' 数据归属地区
查阅OracleGoldenGate官方文档,《ErrotMessageReference》上面有对该问题的描述:
OGG-01163:Bad column length ({3,number,0})specified for column {1} in table{0},
maximumallowable length is {2,number,0}.
Cause:There was an internal errorconverting trail file data. A bufferoverflow
wasdetected.
Action:Contact Oracle Support.
众所周知,Oracle在处理char类型字段时,会对该字段自动补位,但是即便如此,字段长度也不会超出char类型所定义的长度。为了一看究竟是不是如官方文档所说(GoldenGate在转换trail文件数据时发生内部错误,系统检测到buffer溢出),我们利用GoldenGate自带的logdump工具对产生该错误时读取的trail文件进行了分析,
SQL>desc HX_FP.FP_KFYJXX
Name Type Nullable DefaultComments
--------------------- -------- --------------------------------
1.FPYJUUID CHAR(32) 。。。。。。。
2.SSSWJG_DM CHAR(11) 。。。。。。。
3.FPKF_DM CHAR(32) 。。。。。。。
4.FPZL_DM VARCHAR2(5) 。。。。。。。
5.FPHLBS NUMBER(10) 。。。。。。。
6.FPYJBS NUMBER(10) 。。。。。。。
7.LRR_DM CHAR(11) 。。。。。。。
8.LRRQ DATE 。。。。。。。
9.XGR_DM CHAR(11) 。。。。。。。
10.XGRQ DATE 。。。。。。。
11.FPYJBL NUMBER(16,6) 。。。。。。。
12.SJGSRQ DATE 。。。。。。。
13.SJGSDQ CHAR(5) '00000' 数据归属地区
Trail文件dump:
通过inforeplicatrep,showch 可以查看所在的trail文件,并可以查看seqno和rba。
Logdump15 >open ./dirdat/zc000063
CurrentLogTrail is/home/oracle/ggs/dirdat/zc000063
Logdump16 >ghdr on
Logdump17 >detail on
Logdump18 >detail data
Logdump19 >usertoken on
Logdump20 >pos 653304
Readingforward from RBA 653304
Logdump21 >n
___________________________________________________________________
Hdr-Ind:E (x45) Partition: .(x04)
UndoFlag:. (x00) BeforeAfter: A (x41)
RecLength:270 (x010e) IO Time: 2012/10/16 11:36:51.721.932
IOType:5 (x05) OrigNode: 255 (xff)
TransInd:. (x03) FormatType : R (x52)
SyskeyLen: 0 (x00) Incomplete : . (x00)
AuditRBA: 500 AuditPos : 18925072
Continued:N (x00) RecCount: 1 (x01)
2012/10/1611:36:51.721.932 Insert Len 270 RBA 653304
Name:HX_FP.FP_KFYJXX
AfterImage: Partition 4Gs
000000220000 64623834 3732 6166 6563 3137 3432 | ..."..db8472afec1742
3837386233623063 6562 6366 3361 3538 3263 0001 | 878b3b0cebcf3a582c..
000d000031353030 3130 3933 3830 3000 0200 2200 | ....15001093800...".
0031626632626231 3962 3961 3634 6463 3239 6562 | .1bf2bb19b9a64dc29eb
3934663565613131 3330 6536 6300 0300 0900 0000 | 94f5ea1130e6c.......
0534323033360004 000a 0000 0000 0000 0000 0064 | .42036.............d
0005000a00000000 0000 0000 0005 0006 000d 0000 | ....................
Column 0(x0000), Len 34 (x0022) //可以看到列是从0开始的,那么13列,就是第12Col
0000646238343732 6166 6563 3137 3432 3837 3862 | ..db8472afec1742878b
3362306365626366 3361 3538 3263|3b0cebcf3a582c
Column1(x0001), Len 13 (x000d)
0000313530303130 3933 3830 30|..15001093800
Column 2(x0002), Len 34 (x0022)
0000316266326262 3139 6239 6136 3464 6332 3965 | ..1bf2bb19b9a64dc29e
6239346635656131 3133 3065 3663|b94f5ea1130e6c
Column3(x0003), Len 9 (x0009)
0000000534323033 36|....42036
Column4(x0004), Len 10 (x000a)
0000000000000000 0064|.........d
Column 5(x0005), Len 10 (x000a)
0000000000000000 0005|..........
Column 6(x0006), Len 13 (x000d)
0000313530303130 3932 3231 30 |..15001092210
Column 7(x0007), Len 21 (x0015)
0000323031322d31 302d 3136 3a31 313a 3332 3a33 | ..2012-10-16:11:32:3
31|1
Column 8(x0008), Len 13 (x000d)
ffff000000000000 0000 0000 00|.............
Column 9(x0009), Len 21 (x0015)
ffff313930302d30 312d 3031 3a30 303a 3030 3a30 | ..1900-01-01:00:00:0
30|0
Column 10(x000a), Len 10 (x000a)
0000000000000000 c350 |.........P
Column 11(x000b), Len 21 (x0015)
ffff313930302d30 312d 3031 3a30 303a 3030 3a30 | ..1900-01-01:00:00:0
30 | 0
Column 12 (x000c), Len 9 (x0009)
0000000530303030 30 |....00000
我们发现实际trail文件中相应字段的长度都要比表定义的长度要长(猜测可能跟Oracle内部机制有关),但是实际发生问题的字段长度要比定义长度长很多(9vs5)。定位问题该问题是由bug导致。考虑通过配置OGG同步不同定义的表来规避此问题。
在源端用defgen生成定义文件,然后再传到目标端,并在复制进程指定,并去掉assumetargetdefs参数,具体操作步骤如下:
--在源端数据库OGG安装目录下创建配置文件source.prm
$cd /goldengate
$vim source.prm
defsfile./dirdef/source.def,purge
useridogg, PASSWORD ogg
tableusername.tablename;
tableusername.tablename;
···
--生成数据库表的定义文件
$cd /goldengate
$./defgen paramfile source.prm
--使用ftp将./dirdef/source.def上传到目标端./dirdef目录下
--在复制进程中去掉ASSUMETARGETDEFS,加上如下参数:
SOURCEDEFS./dirdef/source.def
注:抓取进程可以考虑不新增加新的抓取进程,但是应用进程需新增一个,新增加的应用进程需增加参数:HANDLECOLLISIONS(查重功能)。并且启动前须作操作alterreplgggextseqno 37, extrba 1883。(此时的extseqno和extrba为处理失败时的值)
这些值怎么查看呢?
info进程名称,showch