OGG 同步无主键表且目标表多一个隐藏字段
问题描述:
已知OGG在同步无主键的表时,OGG会自动设置表的全字段为主键,若目标表字段多于源表,同步过程中replicat进程可以读取insert操作但无法进行update操作,从而导致replicat进程abend。
探究:Oracle12c引入了一个新特性——隐藏字段,若将目标表多的字段隐藏,OGG 是否能进行正常同步。
环境准备:
在同一数据库中不同用户下进行ogg同步,源端用户oggs,目标端用户oggt。
源端 创建A表结构:
SQL > create table oggs.A(id number,name varchar2(12));
目标端 创建A表结构:
SQL > create table oggt.A(id number,name varchar2(12),time timestamp(6) invisible);
注意:seletc * from…不会出现隐藏字段,必须select隐藏字段才能显示。
OGG 进程配置:
extract 进程
extract ex dynamicresolution userid oggs,password oggs exttrail ./dirdat/as table oggs.A;
pump 进程
extract pu rmthost 127.0.0.1, mgrport 7909 rmttrail ./dirdat/at table oggs.A;
replicat 进程
replicat re dboptions integratedparams(parallelism 6) userid oggt, password oggt map oggs.A, target oggt.A, colmap(usedefaults, time=@datenow());
启动测试:
启动源端ex、pu进程,目标端re进程
在启动ex过程中OGG报错: ERROR OGG-02022 Logmining server does not exist on this Oracle database.
解决方案:GGSCI > register extract ex database
源端A表插入数据
SQL> insert into oggs.A values(1,'a');
1 row inserted
SQL> commit;
Commit complete
SQL> select * from oggs.A;
ID NAME
------ ------------
1 a
目标端查询数据是否插入
SQL> select id,name,time from oggt.A;
ID NAME TIME
---------- ------------ ------------------------------------------------------------------------------
1 a 20-9月 -19 02.06.22.000000 下午
(目标端正常插入数据)
源端 update 数据
SQL> update oggs.A set name='b' where id=1;
1 row updated
SQL> commit;
Commit complete
SQL> select * from oggs.A;
ID NAME
------ ------------
1 b
目标端查询数据是否更新
SQL> select id,name,time from oggt.A;
ID NAME TIME
---------- ------------ ------------------------------------------------------------------------------
1 a 20-9月 -19 02.06.22.000000 下午
(目标端数据未更新,更新失败)
查看 replicat 进程报告
GGSCI > view report re
2019-09-20 14:15:28 ERROR OGG-01296 Error mapping from OGGS.A to OGGT.A.
2019-09-20 14:15:34 ERROR OGG-01668 PROCESS ABENDING.
Report at 2019-09-20 14:15:34 (activity since 2019-09-20 14:06:22)
From Table OGGS.A to OGGT.A:
# inserts: 1
# updates: 0
# deletes: 0
# discards: 1
(显示插入一个数据,丢弃一个数据)
结果:同步失败。
给re进程更新配置,添加指定keycols(id,name) 使得同源端主键一致
replicat 进程
replicat re dboptions integratedparams(parallelism 6) userid oggt, password oggt map oggs.A, target oggt.A, keycols(id,name),colmap(usedefaults, time=@datenow());
重启re进程,目标端查询数据
SQL> select id,name,time from oggt.A;
ID NAME TIME
---------- ------------ ------------------------------------------------------------------------------
1 b 20-9月 -19 02.29.07.000000 下午
查看 replicat 进程报告
GGSCI>view report re
Report at 2019-09-20 14:36:31 (activity since 2019-09-20 14:29:07)
From Table OGGS.A to OGGT.A:
# inserts: 1
# updates: 1
# deletes: 0
# discards: 0
(显示插入一个数据,更新一个数据)
结果:同步正常进行
结论:在同步无主键的表时,即使将目标表的多出的字段隐藏,若不指定keycols,同样会导致OGG 同步update失败。
因此,在同步没有主键的表时,需在进程中配置keycols或在同步开始之前在数据库中为需要同步的表设定主键。