这个很好解释的,如果你使用过logminer的话,你就能理解,对日志进行挖掘的时候,需要从数据库里去查询对象的名称。因为日志文件里只含有对象id而无名称。同样的道理,goldengate抽取出来的队列文件里是不包含字段名称的,只包含字段的id.如下所示:Logdump 28 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 27 (x001b) IO Time : 2012/01/05 17:36:13.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x02) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 5 AuditPos : 21343248
Continued : N (x00) RecCount : 1 (x01)
2012/01/05 17:36:13.000.000 Insert Len 27 RBA 1339
Name: MYTESTSRC.TEST3
After Image: Partition 4 G e
0000 0005 0000 0001 3600 0100 0e00 0000 0a30 352d | ........6........05-
31d4 c220 2d31 32 | 1.. -12
Column 0 (x0000), Len 5 (x0005)
0000 0001 36 | ....6
Column 1 (x0001), Len 14 (x000e)
0000 000a 3035 2d31 d4c2 202d 3132 | ....05-1.. -12
GGS tokens:
TokenID x52 'R' ORAROWID Info x00 Length 20
4141 414d 314d 4141 4541 4141 4147 3441 4144 0001 | AAAM1MAAEAAAAG4AAD..
TokenID x4c 'L' LOGCSN Info x00 Length 7
3132 3938 3633 30 | 1298630
TokenID x36 '6' TRANID Info x00 Length 8
382e 3434 2e36 3036 | 8.44.606
这个在源数据库里scn为1298630,事务号xid为8.44.606的insert操作:插入两个字段column 0 , column 1
当目标端复制进程进行复制时,现在的问题就是复制进程将这个操作再次转换为sql语句,它需要知道这个insert mytestsrc.test3这个表的字段名称。
有两种方式一种是从数据库里取,一种是从def定义文件里取取。
对应你的情况就是,当你不生成def文件(实际上同构环境下也不需要生成def文件),从目标端数据库里取。
所以它不管你的字段名称是什么,只根据队列文件里的column id去得到这个字段名称,就会根据字段名称生成insert语句,然后在目标库上执行这个sql语句。
当你用def文件时,goldengate就从你的def文件里得到字段名称:
def文件内容如下:
Definition for table MYTEST.TEST11
Record length: 74
Syskey: 0
Columns: 2
ID 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2
NAME 64 12 56 0 0 1 0 12 12 0 0 0 0 0 1 0 1 0
End of definition
所以当ogg从目标库获取字段名称生成sql语句时,表结构发生变化时而没开启ddl时, 删除或增加字段导致字段id变化时,字段名称一样,两端id序号不一样时,字段插入顺序也会混乱,把源端c字段插入目标端d字段。
如果你测试过goldengate ALO模式下的复制,你就能深入理解这个过程了。你可以从源数据库拷贝归档到其他主机上,在其他主机上建立一个object id 数据库(这个数据库只包含源system,undo,temp表空间),让goldengate工作于alo模式去从归档抽取数据,当你的表结构不发生变更时,你甚至可以让抽取进程在启动时一次性加载完所有的表然后直接关闭数据库,抽取进程也是可以正常工作的。这里我先前有错误,这里是加载的表的名称。
file:///C:\Users\lavender010\AppData\Roaming\Tencent\Users\275897695\QQ\WinTemp\RichOle\XSWFG5E%L78)B0FAD6E0_ER.jpg
[本帖最后由 newway 于 2012-7-23 15:49 编辑]