今天在工作中出现一个问题,配置goldengata做库对库数据同步,采用COLMAP配置项对目标库增加附加字段。当源端增加新字段后,目标表可以同步字段结构,但是新字段内没有数据。很是诡异,下面分项一下测试过程。
测试过程操作如下
1. 增加checkpoint表
DBLOGIN[SOURCEDB <dsn>][, USERID <db_user>][, PASSWORD<pw>[<encryption
options]]
ADDCHECKPOINTTABLE [<owner>.<table>]
EDIT PARAMS./GLOBALS
CHECKPOINTTABLE<owner>.<table>
例如:
dblogin userid ggs,password ggs
add checkpointtableggs.test_ckpt
EDIT PARAMS ./GLOBALS
CHECKPOINTTABLE ggs.test_ckpt
注意:修改globals文件,需要重启ggsci
修改replicat配置文件
REPLICAT REP_TS2
ASSUMETARGETDEFS
SETENV (ORACLE_SID="ORCL")
USERID ggs,PASSWORDggs
MAP GGS.TEST_REP_TS1,TARGET GGS.TEST_REP_TS2;
测试同步
1. 源增加记录-【测试成功】。
insert into GGS.TEST_REP_TS1 values (13,'123');
select * from GGS.TEST_REP_TS1;
2. 修改记录-【测试成功】
update ggs.test_rep_ts1 set name = '1' where id = 13;
3. 源端增加字段-【测试成功】
alter table GGS.TEST_REP_TS1 add (ts_1 varchar(12));
insert into GGS.TEST_REP_TS1 values (16, '123','a');
select * from GGS.TEST_REP_TS2;
4. 删除字段-【测试成功】
alter table GGS.TEST_REP_TS1drop column TS_4;
alter table GGS.TEST_REP_TS1drop column TS_3;
alter table GGS.TEST_REP_TS1drop column TS_2;
alter table GGS.TEST_REP_TS1drop column TS_1;
目标端增加映射字段
增加如下配置
MAPGGS.TEST_REP_TS1 TARGET GGS.TEST_REP_TS2, &
COLMAP(USEDEFAULTS,BA_TYPE=@GETENV("GGHEADER","BEFOREAFTERINDICATOR")),&
KEYCOLS(ID);
没有报错,增加一条记录后,进程报错。修改目标表后错误消失。
alter table GGS.TEST_REP_TS2 add (BA_TYPE varchar2(30));
但是目标表中原始数据的BA_TYPE均为空值。新增记录有值
select id,ba_type from ggs.test_rep_ts2;
原表再次增加字段
alter table GGS.TEST_REP_TS1 add (ts_2 varchar(12));
字段可以正常增加过来。
insert into GGS.TEST_REP_TS1 values (18, '123','a','b');
但是新段中的值无法同步过来。更新字段也不能反应在目标端
update ggs.test_rep_ts1 set ts_2 = 'c' where id = 18;
原端新加一条记录,其它字段可以加进来,但是BA_TYPE以后的字段无法增加进来
insert into GGS.TEST_REP_TS1 values (19, '123','a','b');
修改BA_TYPE的位置到最后,再增加一条记录测试,记录可以添加进去,但是ts_2中仍然没有值。
alter table GGS.TEST_REP_TS2drop column BA_TYPE;
alter table GGS.TEST_REP_TS2 add (BA_TYPE varchar2(30));
insert into GGS.TEST_REP_TS1 values (20, '123','a','b');
修改配置文件,将USEDEFAULTS放到后面,启动进程正常
COLMAP(BA_TYPE =@GETENV("GGHEADER","BEFOREAFTERINDICATOR"),USEDEFAULTS)
增加一条记录,新增字段可以正常增加到目标端,并且其它字段也正常。
insert into GGS.TEST_REP_TS1 values (21, '123','a','b');
select * from ggs.test_rep_ts2 where id = 21;
再增加一个字段测试,字段可以正常同步
alter table GGS.TEST_REP_TS1 add (ts_3 varchar(12));
增加一条记录,还是不能同步新字段ts_3
insert into GGS.TEST_REP_TS1 values (22, '123','a','b', 'c');
select * from ggs.test_rep_ts2 where id = 22;
重新抽取进程,也不管用。
insert into GGS.TEST_REP_TS1 values (23, '123','a','b', 'c');
select * from ggs.test_rep_ts2 where id = 27;
但是如果编辑rep进程。重新生成。则数据正常。增加DYNAMICRESOLUTION
测试一下。
insert into GGS.TEST_REP_TS1 values (28, '123','a','b', 'c');
再增加一个字段测试,字段可以正常同步
alter table GGS.TEST_REP_TS1 add (ts_4 varchar(12));
insert into GGS.TEST_REP_TS1 values (33, '123','a','b', 'c','d');
alter table GGS.TEST_REP_TS1 add (ts_5 varchar(12));
insert into GGS.TEST_REP_TS1 values (37, '123','a','b', 'c','d', 'e');