OGG目标端比源端字段多测试

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