問題描述:數據庫
已知:OGG在同步無主鍵的表時,OGG會自動設置表的全字段爲主鍵,若目標表字段多於源表,同步過程當中replicat進程能夠讀取insert操做但沒法進行update/delete操做,從而致使replicat進程abend。app
探究:Oracle12c引入了一個新特性——隱藏字段,若將目標表多的字段隱藏,ogg是否能進行正常同步。測試
環境準備:this
在同一數據庫中不一樣用戶下進行ogg同步,源端用戶oggs,目標端用戶oggt。server
源端建立A表結構:blog
SQL>create table oggs.A(id number,name varchar2(12));進程
目標端建立A表結構:ip
SQL>create table oggt.A(id number,name varchar2(12),time timestamp(6) invisible);get
注: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, oggtime=@datenow());
啓動測試:
1啓動源端ex、pu進程,目標端re進程;
在啓動ex過程當中OGG報錯: ERROR OGG-02022 Logmining server does not exist on this Oracle database.
***解決方案:GGSCI>register extract ex database
2源端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
3目標端查詢數據是否插入:
SQL> select id,name,time from oggt.A;
ID NAME TIME
---------- ------------ --------------------------------------------------------------------------------
1 a 20-9月 -19 02.06.22.000000 下午
4源端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
5目標端查詢數據是否更新:
SQL> select id,name,time from oggt.A;
ID NAME TIME
--------- ------------- --------------------------------------------------------------------------------
1 a 20-9月 -19 02.06.22.000000 下午
6查看目標端OGG 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 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 下午
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、delete失敗。
所以,在同步沒有主鍵的表時,且目標字段與源字段數量不一樣,此時需在進程中配置keycols或在同步開始以前在數據庫中爲須要同步的表設定主鍵。