本文主要探讨handlecollisions参数的作用。

环境

ogg12c版本。

源端目标端都在a列上有主键。

准备工作

停掉抽取进程和投递进程

源端插入几条数据

源端抽取进程跳过这些insert,alter extract EXT_MI01,begin now

启动抽取进程和投递进程

Delete实验

目标端

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

3 rows selected.

源端:

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

4 23-OCT-18 3

5 23-OCT-18 3

5 rows selected.

源端delete,并提交

SQL> delete from t3 where a=4;

复制进程abend:

2018-10-23 14:39:05 WARNING OGG-01004 Aborted grouped transaction on 'MING.T3', Database error 1403 (OCI Error ORA-01403: no data found, SQL <DELETE FROM "MING"."T3" WHERE "A" = :b0 A

ND "EUTIME" = :b1 AND "B" = :b2 AND ROWNUM = 1>).

2018-10-23 14:39:05 WARNING OGG-01003 Repositioning to rba 2135 in seqno 7.

2018-10-23 14:39:05 WARNING OGG-01154 SQL error 1403 mapping MING.T3 to MING.T3 OCI Error ORA-01403: no data found, SQL <DELETE FROM "MING"."T3" WHERE "A" = :b0 AND "EUTIME" = :b1 AND

"B" = :b2 AND ROWNUM = 1>.

Source Context :

SourceModule : [er.errors]

SourceID : [/scratch/aime/adestore/views/aime_adc4150330/oggcore/OpenSys/src/app/er/errors.cpp]

SourceFunction : [take_rep_err_action]

SourceLine : [941]

ThreadBacktrace : [15] elements

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageContext::AddThreadContext()+0x1b) [0x7f9d6f0554eb]]

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...)+0x135) [0x7f9d6f04f5c5]]

: [/u01/app/oracle/products/ogg/libgglog.so(_MSG_ERR_MAP_TO_TANDEM_FAILED(CSourceContext*, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, ggs::gglib::g

gapp::CQualDBObjName<(DBObjType)1> const&, CMessageFactory::MessageDisposition)+0x50) [0x7f9d6f048c7c]]

: [/u01/app/oracle/products/ogg/replicat(take_rep_err_action(short, int, char const*, extr_ptr_def*, std_rec_hdr_def*, char*, file_def*, bool)+0x17aa) [0x5b63ef

]]

: [/u01/app/oracle/products/ogg/replicat(replicate_io(ggs::gglib::ggdatasource::DataSource*, file_def*, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglcr::

CommonLCR*, extr_ptr_def*, int*, int)+0x3847) [0x63ad27]]

: [/u01/app/oracle/products/ogg/replicat(process_record(ggs::gglib::ggdatasource::DataSource*, file_def*&, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglc

r::CommonLCR*, short&, extr_ptr_def*&, extr_ptr_def*&, int&, int&, int&, bool)+0x2f8) [0x63f018]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::processReplicatLoop(ggs::Heartbeat::MapGeneratorParams&)+0x1061) [0x5f6cc1]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::run(ggs::Heartbeat::MapGeneratorParams&)+0x29) [0x5eae39]]

: [/u01/app/oracle/products/ogg/replicat() [0x633c7b]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::ExecMain()+0x60) [0x6ecbe0]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*)+0x14d) [0x6edbfd]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::Run(int, char**)+0xb1) [0x6edce1]]

: [/u01/app/oracle/products/ogg/replicat(main+0x3b) [0x636c9b]]

: [/lib64/libc.so.6(__libc_start_main+0xfd) [0x37cba1ed1d]]

: [/u01/app/oracle/products/ogg/replicat() [0x56c559]]

2018-10-23 14:39:05 ERROR OGG-01296 Error mapping from MING.T3 to MING.T3.

复制进程修改参数,添加handlecollisions

map ming.t3, target ming.t3,handlecollisions;

启动复制进程

start rep_mi01

GGSCI (ORADB-8955.datadept.eastmoney.com.sh) 79> stats REP_MI01,table ming.t3,total

Sending STATS request to REPLICAT REP_MI01 ...

Start of Statistics at 2018-10-23 14:53:21.

Replicating from MING.T3 to MING.T3:

*** Total statistics since 2018-10-23 14:53:03 ***

Total inserts 0.00

Total updates 0.00

Total deletes 1.00

Total discards 0.00

Total operations 1.00

Total delete collisions 1.00

End of Statistics

Update实验

去掉handlecollisions参数,源端插入数据抽取进程并跳过这些差异数据。

源端

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

5 23-OCT-18 3

6 23-OCT-18 3

4 23-OCT-18 3

6 rows selected.

目标端

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

3 rows selected.

源端update一条数据并提交:

SQL> update t3 set a=7,b=4 where a=6;

目标端复制进程abend

2018-10-23 15:06:20 WARNING OGG-01004 Aborted grouped transaction on 'MING.T3', Database error 1403 (OCI Error ORA-01403: no data found, SQL <UPDATE "MING"."T3" x SET x."A" = :a3,x."EU

TIME" = :a4,x."B" = :a5 WHERE x."A" = :b0>).

2018-10-23 15:06:20 WARNING OGG-01003 Repositioning to rba 5635 in seqno 7.

2018-10-23 15:06:20 WARNING OGG-01154 SQL error 1403 mapping MING.T3 to MING.T3 OCI Error ORA-01403: no data found, SQL <UPDATE "MING"."T3" x SET x."A" = :a3,x."EUTIME" = :a4,x."B" = :

a5 WHERE x."A" = :b0>.

Source Context :

SourceModule : [er.errors]

SourceID : [/scratch/aime/adestore/views/aime_adc4150330/oggcore/OpenSys/src/app/er/errors.cpp]

SourceFunction : [take_rep_err_action]

SourceLine : [941]

ThreadBacktrace : [15] elements

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageContext::AddThreadContext()+0x1b) [0x7f552516e4eb]]

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...)+0x135) [0x7f55251685c5]]

: [/u01/app/oracle/products/ogg/libgglog.so(_MSG_ERR_MAP_TO_TANDEM_FAILED(CSourceContext*, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, ggs::gglib::g

gapp::CQualDBObjName<(DBObjType)1> const&, CMessageFactory::MessageDisposition)+0x50) [0x7f5525161c7c]]

: [/u01/app/oracle/products/ogg/replicat(take_rep_err_action(short, int, char const*, extr_ptr_def*, std_rec_hdr_def*, char*, file_def*, bool)+0x17aa) [0x5b63ef

]]

: [/u01/app/oracle/products/ogg/replicat(replicate_io(ggs::gglib::ggdatasource::DataSource*, file_def*, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglcr::

CommonLCR*, extr_ptr_def*, int*, int)+0x3847) [0x63ad27]]

: [/u01/app/oracle/products/ogg/replicat(process_record(ggs::gglib::ggdatasource::DataSource*, file_def*&, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglc

r::CommonLCR*, short&, extr_ptr_def*&, extr_ptr_def*&, int&, int&, int&, bool)+0x2f8) [0x63f018]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::processReplicatLoop(ggs::Heartbeat::MapGeneratorParams&)+0x1061) [0x5f6cc1]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::run(ggs::Heartbeat::MapGeneratorParams&)+0x29) [0x5eae39]]

: [/u01/app/oracle/products/ogg/replicat() [0x633c7b]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::ExecMain()+0x60) [0x6ecbe0]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*)+0x14d) [0x6edbfd]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::Run(int, char**)+0xb1) [0x6edce1]]

: [/u01/app/oracle/products/ogg/replicat(main+0x3b) [0x636c9b]]

: [/lib64/libc.so.6(__libc_start_main+0xfd) [0x37cba1ed1d]]

: [/u01/app/oracle/products/ogg/replicat() [0x56c559]]

2018-10-23 15:06:20 ERROR OGG-01296 Error mapping from MING.T3 to MING.T3.

复制进程添加

map ming.t3, target ming.t3,handlecollisions;

开启复制进程

start rep_mi01

handlecollisions变update为insert了

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

7 23-OCT-18 4

4 rows selected.

Insert实验

目标端插入一条数据并提交

SQL> insert into t3(a,b) values(9,9);

源端插入主键为9的数据

SQL> insert into t3(a) values(9);

SQL> commit;

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

5 23-OCT-18 4

7 23-OCT-18 4

4 23-OCT-18 3

8 23-OCT-18 3

9 23-OCT-18 3

8 rows selected.

目标端:

SQL> select * from t3;

A EUTIME B

---------- --------------- ----------

1 3

2 22-OCT-18 3

3 22-OCT-18 3

7 23-OCT-18 4

5 23-OCT-18 4

8 23-OCT-18 3

9 23-OCT-18 3

7 rows selected.

目标端复制进程没有abend,旧的数据被覆盖,以源端为主。

去掉复制进程中的handlecollisions,源端插入数据

SQL> insert into t3(a,b) values(10,10);

SQL> commit;

源端插入数据并提交

SQL> insert into t3(a) values(10);

源端进程abend

2018-10-23 15:36:46 WARNING OGG-00869 OCI Error ORA-00001: (MING. (status = 1), SQL <INSERT INTO "MING"."T3" ("A","EUTIME","B") VALUES (:a0,:a1,:a2)>.

2018-10-23 15:36:46 WARNING OGG-01004 Aborted grouped transaction on 'MING.T3', Database error 1 (OCI Error ORA-00001: (MING. (status = 1), SQL <INSERT INTO "MING"."T3" ("A","EUTIME",

"B") VALUES (:a0,:a1,:a2)>).

2018-10-23 15:36:46 WARNING OGG-01003 Repositioning to rba 6366 in seqno 7.

2018-10-23 15:36:46 WARNING OGG-01154 SQL error 1 mapping MING.T3 to MING.T3 OCI Error ORA-00001: (MING. (status = 1), SQL <INSERT INTO "MING"."T3" ("A","EUTIME","B") VALUES (:a0,:a1,

:a2)>.

Source Context :

SourceModule : [er.errors]

SourceID : [/scratch/aime/adestore/views/aime_adc4150330/oggcore/OpenSys/src/app/er/errors.cpp]

SourceFunction : [take_rep_err_action]

SourceLine : [941]

ThreadBacktrace : [15] elements

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageContext::AddThreadContext()+0x1b) [0x7f118d26c4eb]]

: [/u01/app/oracle/products/ogg/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...)+0x135) [0x7f118d2665c5]]

: [/u01/app/oracle/products/ogg/libgglog.so(_MSG_ERR_MAP_TO_TANDEM_FAILED(CSourceContext*, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, ggs::gglib::g

gapp::CQualDBObjName<(DBObjType)1> const&, CMessageFactory::MessageDisposition)+0x50) [0x7f118d25fc7c]]

: [/u01/app/oracle/products/ogg/replicat(take_rep_err_action(short, int, char const*, extr_ptr_def*, std_rec_hdr_def*, char*, file_def*, bool)+0x17aa) [0x5b63ef

]]

: [/u01/app/oracle/products/ogg/replicat(replicate_io(ggs::gglib::ggdatasource::DataSource*, file_def*, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglcr::

CommonLCR*, extr_ptr_def*, int*, int)+0x3847) [0x63ad27]]

: [/u01/app/oracle/products/ogg/replicat(process_record(ggs::gglib::ggdatasource::DataSource*, file_def*&, ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglc

r::CommonLCR*, short&, extr_ptr_def*&, extr_ptr_def*&, int&, int&, int&, bool)+0x2f8) [0x63f018]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::processReplicatLoop(ggs::Heartbeat::MapGeneratorParams&)+0x1061) [0x5f6cc1]]

: [/u01/app/oracle/products/ogg/replicat(ggs::er::ReplicatContext::run(ggs::Heartbeat::MapGeneratorParams&)+0x29) [0x5eae39]]

: [/u01/app/oracle/products/ogg/replicat() [0x633c7b]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::ExecMain()+0x60) [0x6ecbe0]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*)+0x14d) [0x6edbfd]]

: [/u01/app/oracle/products/ogg/replicat(ggs::gglib::MultiThreading::MainThread::Run(int, char**)+0xb1) [0x6edce1]]

: [/u01/app/oracle/products/ogg/replicat(main+0x3b) [0x636c9b]]

: [/lib64/libc.so.6(__libc_start_main+0xfd) [0x37cba1ed1d]]

: [/u01/app/oracle/products/ogg/replicat() [0x56c559]]

2018-10-23 15:36:46 ERROR OGG-01296 Error mapping from MING.T3 to MING.T3.

再次加入handlecollisions参数,目标端数据被修改为与源端一致。

总结:

1.handlecollisions是复制进程参数

2.对于delete操作,无handlecollisions参数,源端delete一条数据,目标端没有符合要求,那么复制进程会abend;

有handlecollisions参数,复制进程不会abend,目标端会跳过delete

3.对于update操作,无handlecollisions参数,源端update一条数据,目标端没有符合要求,那么复制进程会abend;

有handlecollisions参数,复制进程不会abend,目标端将update变为insert,将数据插入目标端。

4.对于insert操作,无handlecollisions参数,源端insert一条数据,目标端违反了唯一性约束,那么复制进程会abend;

有handlecollisions参数,复制进程不会abend,目标端将按照源端数据,修改目标端违反唯一性约束的数据。