1.1需求
需求,客户需要在OGG灾备目标端环境进行发版(对应的工作就是目标端表新增字段),结果就是OGG复制进程报错!
测试模拟如何处理这个问题;
1.2实验环境准备
实验环境准备 源端 SQL> delete dd ; commit; 目标端查询 select * from dd; no rows selected
1.3测试
1)COLMAP参数使用
目标端新增一个字段 alter table dd add hcc_name varchar2(200); OGG参数 assumetargetdefs 源insert insert into dd values(1,2,sysdate); commit; 目标端正常【是不是非常不正常???字段都不一致了,怎么插入数据不报错呢????] select id,hcc_name from dd; ID HCC_NAME ---------- ---------- 1 源insert insert into dd(id,cc_name,WITTIME) values(2,2,sysdate); commit; 目标端 select id,hcc_name from dd ID HCC_NAME ---------- ---------- 2 1 源端复制进程stop,start 源insert insert into dd(id,cc_name,WITTIME) values(4,2,sysdate); commit; 目标端 select id,hcc_name from dd; 2020-11-11 06:37:36 ERROR OGG-00918 Key column HCC_NAME is missing from map. !OGG有个特点,只有进程启动的时候才会去重新读取表定义信息,因此有的时候你发现两个表的表结构早就不一致但是不报错,但是某个时刻其它原因导致进程abend后再次启动,
出现各种提示表结构不一致的错误。 此时解决方法? 1.源端删除字段,再次进行同步; 2.使用COLMAP 对每个字段进行同步指定 MAP YZ.DD ,TARGET BAK_YZ.DD,COLMAP(ID=ID,CC_NAME=CC_NAME,WITTIME=WITTIME,HCC_NAME=''); 此时目标端新增的字段用null处理 SQL> select id,hcc_name from dd; ID HCC_NAME ---------- ---------- 2 4 1
2)源端新增字段后,两边表结构一致,测试确保数据正常同步
如果目标端进行发版,删除colmap参数后,新增字段是否能进行同步; 源端新增字段 alter table dd add hcc_name varchar2(200); 源insert insert into dd values(2,2,sysdate,5); commit; 目标端 select id,hcc_name from dd 2020-11-11 06:50:09 ERROR OGG-00918 Key column HCC_NAME is missing from map. dump查询 GGSCI (t2) 100> info repa REPLICAT REPA Last Started 2020-11-11 06:45 Status ABENDED Checkpoint Lag 00:00:00 (updated 00:02:59 ago) Log Read Checkpoint File /u01/ogg/base/dirdat/t1000000056 2020-11-10 22:29:22.808704 RBA 3454 ---打开文件 Logdump 9 >open /u01/ogg/base/dirdat/t1000000056 --查看header record信息 Logdump 15 >ghdr on ---查看列信息,包括number和长度 Logdump 16 >detail on -----To add hex and ASCII data values to the column information Logdump 17 >detail data ---查看用户定义的信 Logdump 18 >usertoken on Logdump 19 >pos 3454 ---显示下一条记录 Logdump 19 >n ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x0c) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 53 (x0035) IO Time : 2020/11/11 06:50:03.741.070 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 355 AuditPos : 5406736 Continued : N (x00) RecCount : 1 (x01) 2020/11/11 06:50:03.741.070 Insert Len 53 RBA 3454 Name: YZ.DD (TDR Index: 2) After Image: Partition x0c G s 0000 0500 0000 0100 3201 0005 0000 0001 0032 0200 | ........2........2.. 1f00 0000 3230 3230 2d31 312d 3130 3a32 323a 3530 | ....2020-11-10:22:50 3a30 332e 3030 3030 3030 3030 30 | :03.000000000 Column 0 (x0000), Len 5 (x0005) 0000 0100 32 | ....2 Column 1 (x0001), Len 5 (x0005) 0000 0100 32 | ....2 Column 2 (x0002), Len 31 (x001f) 0000 3230 3230 2d31 312d 3130 3a32 323a 3530 3a30 | ..2020-11-10:22:50:0 332e 3030 3030 3030 3030 30 | 3.000000000 dump文件中只有3个列的数据变换,确实不存在第四个字段 源端需要对新增字段添加最小补充日志 GGSCI (t1 as ogg@t1) 30> dblogin USERID ogg,PASSWORD ogg Successfully logged into database. GGSCI (t1 as ogg@t1) 31> info trandata yz.dd Logging of supplemental redo log data is enabled for table YZ.DD. Columns supplementally logged for table YZ.DD: "CC_NAME", "ID", "WITTIME". Prepared CSN for table YZ.DD: 2594737 GGSCI (t1 as ogg@t1) 32> delete trandata yz.dd 2020-11-10 22:52:03 INFO OGG-15142 Logging of supplemental redo log data disabled for table YZ.DD. 2020-11-10 22:52:03 INFO OGG-15139 TRANDATA for scheduling columns has been disabled on table YZ.DD. GGSCI (t1 as ogg@t1) 33> add trandata yz.dd 2020-11-10 22:52:09 WARNING OGG-06439 No unique key is defined for table DD. All viable columns will be used to represent the key,
but may not guarantee uniqueness. KEYCOLS may be used to define the key. 2020-11-10 22:52:09 INFO OGG-15130 No key found for table YZ.DD. All viable columns will be logged. 2020-11-10 22:52:09 INFO OGG-15132 Logging of supplemental redo data enabled for table YZ.DD. 2020-11-10 22:52:09 INFO OGG-15133 TRANDATA for scheduling columns has been added on table YZ.DD. 2020-11-10 22:52:09 INFO OGG-15135 TRANDATA for instantiation CSN has been added on table YZ.DD. --目标端ogg 恢复COLMAP暂时处理这一条脏数据后,注释COLAP参数,再次测试。 源insert insert into dd values(5,2,sysdate,5); commit; 目标端 select id,hcc_name from dd insert into dd values(6,2,sysdate,5); commit; Logdump 91 >n ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x00) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 77 (x004d) IO Time : 2020/11/10 23:01:56.201.496 IOType : 170 (xaa) OrigNode : 1 (x01) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) DDR/TDR Idx: (003, 000) AuditPos : 7548432 Continued : N (x00) RecCount : 1 (x01) 2020/11/10 23:01:56.201.496 Metadata Len 77 RBA 3831 Database Name: * DDR Version: 1 Database type: ORACLE Character set ID: UTF-8 National character set ID: UTF-16 Locale: neutral Case sensitivity: 14 14 14 14 14 14 14 14 14 14 14 14 11 14 14 14 TimeZone: GMT Global name: T1 * Logdump 92 >n ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x00) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 544 (x0220) IO Time : 2020/11/10 23:01:56.201.497 IOType : 170 (xaa) OrigNode : 2 (x02) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) DDR/TDR Idx: (003, 003) AuditPos : 7548432 Continued : N (x00) RecCount : 1 (x01) 2020/11/10 23:01:56.201.497 Metadata Len 544 RBA 3959 Table Name: YZ.DD * 1)Name 2)Data Type 3)External Length 4)Fetch Offset 5)Scale 6)Level 7)Null 8)Bump if Odd 9)Internal Length 10)Binary Length 11)Table Length 12)Most Sig DT 13)Least Sig DT 14)High Precision 15)Low Precision 16)Elementary Item 17)Occurs 18)Key Column 19)Sub DataType 20)Native DataType 21)Character Set 22)Character Length 23)LOB Type 24)Partial Type * TDR version: 11 Definition for table YZ.DD Record Length: 830 Columns: 6 ID 64 50 0 0 0 1 0 50 50 50 0 0 0 0 1 0 1 2 2 -1 0 0 0 CC_NAME 64 200 56 0 0 1 0 200 200 0 0 0 0 0 1 0 1 0 1 -1 0 0 0 WITTIME 192 29 262 0 0 1 0 29 29 29 0 6 0 0 1 0 1 0 187 -1 0 0 0 SYS_NC00004$ 64 36 294 0 0 1 0 18 18 0 0 0 0 0 1 0 0 4 23 -1 0 0 0 property: 0x0000000000030128 SYS_NC00005$ 64 602 318 0 0 1 0 301 301 0 0 0 0 0 1 0 0 4 23 -1 0 0 0 property: 0x0000000000030128 HCC_NAME 64 200 624 0 0 1 0 200 200 0 0 0 0 0 1 0 1 0 1 -1 0 0 0 End of definition Logdump 93 >n ___________________________________________________________________ Hdr-Ind : E (x45) Partition : . (x0c) UndoFlag : . (x00) BeforeAfter: A (x41) RecLength : 62 (x003e) IO Time : 2020/11/11 07:01:53.746.059 IOType : 5 (x05) OrigNode : 255 (xff) TransInd : . (x03) FormatType : R (x52) SyskeyLen : 0 (x00) Incomplete : . (x00) AuditRBA : 355 AuditPos : 7548432 Continued : N (x00) RecCount : 1 (x01) 2020/11/11 07:01:53.746.059 Insert Len 62 RBA 4559 Name: YZ.DD (TDR Index: 3) After Image: Partition x0c G s 0000 0500 0000 0100 3601 0005 0000 0001 0032 0200 | ........6........2.. 1f00 0000 3230 3230 2d31 312d 3130 3a32 333a 3031 | ....2020-11-10:23:01 3a35 342e 3030 3030 3030 3030 3005 0005 0000 0001 | :54.000000000....... 0035 | .5 Column 0 (x0000), Len 5 (x0005) 0000 0100 36 | ....6 Column 1 (x0001), Len 5 (x0005) 0000 0100 32 | ....2 Column 2 (x0002), Len 31 (x001f) 0000 3230 3230 2d31 312d 3130 3a32 333a 3031 3a35 | ..2020-11-10:23:01:5 342e 3030 3030 3030 3030 30 | 4.000000000 Column 5 (x0005), Len 5 (x0005) 0000 0100 35 | ....5 非常无语的是什么呢,源端手工新增字段,源端的抽取进程也需要重启,否则即使ADD TRANDATA 新增字段,插入新增字段的数据,在dump文件中不能不会得到体现! 如果新增字段,最好的方法是,源端stop 抽取进程,源端新增字段,源端delete ,add trandata 等待目标端OGG进程应用完毕残余dump变换后,目标端新增字段,源端启动抽取进程,
目标端启动应用复制进程。 或者目标端等待OGG 复制进程报错提示字段缺失,手工增加字段,重启启动复制进程,源端顺序不变。 源端 SQL> insert into dd values(8,2,sysdate,5); 1 row created. SQL> commit; 目标端 SQL> select id,hcc_name from dd where id=8; ID HCC_NAME ---------- ---------- 8 5