暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

OGG DELETEROWEXISTS UPDATEROWEXISTS 冲突说明

OGG DELETEROWEXISTS UPDATEROWEXISTS 冲突说明

COMPARECOLS and RESOLVECONFLICT DELETEROWEXISTS UPDATEROWEXISTS

RESOLVECONFLICT 解决ogg数据同步时遇到的数据不一致性冲突:

数据强一制性需求:

我们不能在replicate中配置遇到同步错误时忽略跳过,这会导致源端和目标端的数据不一致:
reperror default,discard
REPERROR (-1, IGNORE)

对于OGG的RESOLVECONFLICT的几种情况:

INSERTROWEXISTS UPDATEROWMISSING DELETEROWMISSING 这三种冲突的情况很好理解

对于DELETEROWEXISTS UPDATEROWEXISTS这两种冲突的情况,第一次解读时带着疑问:删除的时候行存在,更新的时候行存在不是正常的情况吗?怎么会有冲突?

正常情况下,删除的时候行存在,更新的时候行存在是没有冲突的,执行操作就是了,那有没有异常的情况呢?答案是有的,就是数据的强一致性要求但是数据不一致的情景:

情景1:数据一致,不存在冲突

对于主键ID=1的update和delete操作,不存在删除或更新时的冲突(id是主键)

-- 源表COG.T1 id num date 1 99 2021-11-11 17:26:47 -- 目标表gz.b1 id num date 1 99 2021-11-11 17:26:47
情景2:数据不一致,没有进行比较,就不会有冲突

对于主键ID=1的update和delete操作,如果replicate时没有配置COMPARECOLS,会忽略掉目标表的值,不会进行检测,不会发生删除或更新时的冲突(id是主键)

-- 源表COG.T1 id num date 1 99 2021-11-11 17:26:47 -- 目标表gz.b1 id num date 1 88 2021-09-09 17:26:47
情景3:数据不一致,进行比较了,就有冲突

对于主键ID=1的update和delete操作,如果replicate时配置了COMPARECOLS,会检测num、date的值是否有冲突,如果不一致发生删除或更新时会有冲突(id是主键)

-- 源表COG.T1 id num date 1 99 2021-11-11 17:26:47 -- 目标表gz.b1 id num date 1 88 2021-09-09 17:26:47

官方的解释如下:

UPDATEROWEXISTS
An updated row exists on the target, but one or more columns have a before image in the trail that is different from the current value in the database.

目标上存在更新的行,但一列或多列在跟踪中有一个不同于数据库中当前值的before image。 before image:解释为源表update之前的值,会和目标表未更新之前的值做比较,执行数据强一致性检查。 例:在情景3:执行SQL: update cog.t1 set num=200 where id=1; 在目标表上执行检查: 1 是否存在id=1的主键对应的行的记录, 2 检查目标表num是否等于99 num=99?(before image) 3 (目标表num=88),会报发生冲突 总结:UPDATEROWEXISTS冲突就是行存在,但是其它列值的数据不一致(强一致性检查)

DELETEROWEXISTS
A deleted row exists in the target, but one or more columns have a before image in the trail that is different from the current value in the database.

目标中存在被删除的行,但一列或多列在跟踪中有一个不同于数据库中当前值的before image

RESOLVECONFLICT 语法:

Syntax RESOLVECONFLICT ( {INSERTROWEXISTS | UPDATEROWEXISTS | UPDATEROWMISSING | DELETEROWEXISTS | DELETEROWMISSING} ( {DEFAULT | resolution_name}, {USEMAX (resolution_column) | USEMAXEQ (resolution_column) | USEMIN (resolution_column) | USEMINEQ (resolution_column) | USEDELTA | DISCARD | OVERWRITE | IGNORE} ) [, COLS (column[,...])] )

主要解决以下三种情况:

,RESOLVECONFLICT(INSERTROWEXISTS,(DEFAULT,OVERWRITE)) ,RESOLVECONFLICT(DELETEROWMISSING,(DEFAULT,DISCARD)) ,RESOLVECONFLICT(UPDATEROWMISSING,(DEFAULT,OVERWRITE))

在COMPARECOLS条件的时候 必须定义DELETEROWEXISTS,UPDATEROWEXISTS 主键行存在,但是compare的列存在冲突的情况的处理方法,否则会replicate进程会abend终止

-- replicate中配置 ,COMPARECOLS (ON UPDATE KEYINCLUDING(I2,D1),ON DELETE KEYINCLUDING(I2,D1) ) ,RESOLVECONFLICT(UPDATEROWEXISTS,(max_d1_method,USEMAX(D1),COLS(D1)),(max_I2_method,USEMAX(I2),COLS(I2)),(DEFAULT,OVERWRITE)) ,RESOLVECONFLICT(DELETEROWEXISTS,(DEFAULT,OVERWRITE))

COMPARECOLS UPDATEROWEXISTS DELETEROWEXISTS生效条件(重要):

-- 1,源端的(列的)原值(update之前的值,不论是不是要update的列),和目标端的当前值不一致(冲突); -- 2,如果compare的列有update: 队列文件中的值(要update的值),和当前目标端的值,取最大值; -- 3,如果compare的列没有update: 源表的值,和当前目标端的值,取最大值;

配置使用COMPARECOLS时注意事项(重要):

1 源端抽取进程:附加日志必须最少附加compare的列 alter table cog.t1 add supplemental log group group_a(OBJECT_ID) always; or alter table cog.t1 add supplemental log data(all) columns; 2 源端抽取进程:必须最少配置GETBEFORECOLS compare的列 table cog.t1,GETBEFORECOLS ( ON UPDATE KEYINCLUDING (I2,D1),ON DELETE KEYINCLUDING (I2,D1)); or table cog.t1,GETBEFORECOLS ( ON UPDATE ALL,ON DELETE ALL);

USEMAX 等说明:

USEMAX | USEMAXEQ | USEMIN | USEMINEQ | USEDELTA | DISCARD | OVERWRITE | IGNORE 对应的操作说明: USEMAX (resolution_column) USEMAX 取最大值 for INSERTROWEXISTS and UPDATEROWEXISTS ,RESOLVECONFLICT(UPDATEROWEXISTS,(use_max_i2,USEMAX(I2))) -- #COMPARECOLS的时候,至少compare的列要加入附加日志传输 -- #可以用于比较的列的类型: NUMERIC DATE TIMESTAMP CHAR/NCHAR VARCHAR/ NVARCHAR ,COMPARECOLS (ON UPDATE ALL,ON DELETE ALL) ,RESOLVECONFLICT(UPDATEROWEXISTS,(DEFAULT,USEMAX(I2))) ,COMPARECOLS (ON UPDATE KEYINCLUDING (I2,D1,D2,N1,N2),ON DELETE KEYINCLUDING (I2,D1,D2,N1,N2)) ,RESOLVECONFLICT(UPDATEROWEXISTS,(DEFAULT,USEMAX(I2))) USEMAXEQ --取最大或者等于的值 USEDELTA -- 仅用于数值类型,取在源表的差值增量运算 USEDELTA 使用说明:假设源表是100 目标表是200 源表的值更新为95,源表的差值是95-100=-5 应用到目标表的时候:值是200+(-5)=195

配置示例:

说明:部署的配置(抽取,pump,复制进程部署到同一主机):

– 抽取进程 ex0

extract ex0 userid c##ggs@CDB,password ggs setenv(ORACLE_HOME=/u01/app/oracle/product/db) setenv(ORACLE_SID=ORCL) setenv(NLS_LANG=AMERICAN_AMERICA.AL32UTF8) GETTRUNCATES REPORTCOUNT EVERY 1 MINUTES, RATE DISCARDFILE ./dirrpt/ex0.dsc,APPEND,MEGABYTES 1000 WARNLONGTRANS 2h,CHECKINTERVAL 5m DBOPTIONS ALLOWUNUSEDCOLUMN exttrail ./dirdat/e0 SOURCECATALOG pdb2 table cog.t1,GETBEFORECOLS ( ON UPDATE ALL,ON DELETE ALL);

– pump进程 pd0

extract pd0 passthru rmthost 1.1.1.91,mgrport 7500,compress rmttrail ./dirdat/p0 SOURCECATALOG pdb2 table cog.t1;

– 复制进程 rp0

replicat rp0 userid c##ggs@pdb2,password ggs setenv(ORACLE_HOME=/u01/app/oracle/product/db) setenv(ORACLE_SID=ORCL) setenv(NLS_LANG=AMERICAN_AMERICA.AL32UTF8) NOHANDLECOLLISIONS reperror (default,abend) discardfile ./dirrpt/rp0.dsc,append,megabytes 50 ALLOWNOOPUPDATES GETTRUNCATES map pdb2.cog.t1,target pdb2.gz.b1 ,RESOLVECONFLICT(INSERTROWEXISTS,(DEFAULT,OVERWRITE)) ,RESOLVECONFLICT(DELETEROWMISSING,(DEFAULT,DISCARD)) ,RESOLVECONFLICT(UPDATEROWMISSING,(DEFAULT,OVERWRITE)) ,COMPARECOLS (ON UPDATE KEYINCLUDING(I2,D1),ON DELETE KEYINCLUDING(I2,D1) ) ,RESOLVECONFLICT(UPDATEROWEXISTS,(max_d1_method,USEMAX(D1),COLS(D1)),(max_I2_method,USEMAX(I2),COLS(I2)),(DEFAULT,OVERWRITE)) ;

实验日志

DELETEROWMISSING INSERTROWEXISTS UPDATEROWMISSING 日志:
– 1 DELETEROWMISSING 测试日志

-- 删除时 目标表记录不存在 -- ogg 告警日志: WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26787: The row with key ("I1") = (6510) does not exist in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 1, RBA 2322 in Integrated mode. REPLICAT will retry in Direct mode. WARNING OGG-01004 rp0.prm: Aborted grouped transaction on PDB2.GZ.B1, Database error 1403 (No data found). WARNING OGG-01003 rp0.prm: Repositioning to rba 2322 in seqno 1. WARNING OGG-01154 rp0.prm: SQL error 1403 mapping PDB2.COG.T1 to PDB2.GZ.B1 No data found. ERROR OGG-01296 rp0.prm: Error mapping from PDB2.COG.T1 to PDB2.GZ.B1. INFO OGG-02333 rp0.prm: Reading /u11/ogg/dirdat/p0000000001, current RBA 2,322, 1 records, m_file_seqno = 1, m_file_rba = 2,579. ERROR OGG-01668 rp0.prm: PROCESS ABENDING. view report rp0 报告显示错误: WARNING OGG-02544 Unhandled error (ORA-26787: The row with key ("I1") = (6510) does not exist in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 1, RBA 2322 in Integrated mode. REPLICAT will retry in Direct mode. WARNING OGG-01004 Aborted grouped transaction on PDB2.GZ.B1, Database error 1403 (No data found). WARNING OGG-01003 Repositioning to rba 2322 in seqno 1. WARNING OGG-01154 SQL error 1403 mapping PDB2.COG.T1 to PDB2.GZ.B1 No data found.

– 2 INSERTROWEXISTS 测试日志

-- 插入时,目标表已经存在行 WARNING OGG-02544 Unhandled error (ORA-26799: unique constraint GZ.SYS_C0011037 violated for table GZ.B1 with column values ("I1") = (6502) ORA-00001: unique constraint (GZ.SYS_C0011037) violated) while processing the record at SEQNO 1, RBA 9757 in Integrated mode. REPLICAT will retry in Direct mode.

– 3 UPDATEROWMISSING 测试日志

WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26787: The row with key ("I1") = (6501) does not exist in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 1, RBA 11890 in Integrated mode. REPLICAT will retry in Direct mode. WARNING OGG-01919 rp0.prm: Missing RESOLVECONFLICT for SQL error 1,403. WARNING OGG-01004 rp0.prm: Aborted grouped transaction on PDB2.GZ.B1, Database error 1403 (No data found). WARNING OGG-01003 rp0.prm: Repositioning to rba 11890 in seqno 1. WARNING OGG-01154 rp0.prm: SQL error 1403 mapping PDB2.COG.T1 to PDB2.GZ.B1 No data found. ERROR OGG-01296 rp0.prm: Error mapping from PDB2.COG.T1 to PDB2.GZ.B1. INFO OGG-02333 rp0.prm: Reading /u11/ogg/dirdat/p0000000001, current RBA 11,890, 16 records, m_file_seqno = 1, m_file_rba = 12,059. ERROR OGG-01668 rp0.prm: PROCESS ABENDING.

– 4 UPDATEROWEXISTS DELETEROWEXISTS 测试日志:

WARNING OGG-01919 rp0.prm: Missing RESOLVECONFLICT for SQL error 1,403. WARNING OGG-01004 rp0.prm: Aborted grouped transaction on PDB2.GZ.B1, Database error 1403 (No data found). WARNING OGG-01003 rp0.prm: Repositioning to rba 6727 in seqno 0. WARNING OGG-01154 rp0.prm: SQL error 1403 mapping PDB2.COG.T1 to PDB2.GZ.B1 No data found. ERROR OGG-01296 rp0.prm: Error mapping from PDB2.COG.T1 to PDB2.GZ.B1. INFO OGG-02333 rp0.prm: Reading /u11/ogg/dirdat/p0000000000, current RBA 6,727, 13 records, m_file_seqno = 0, m_file_rba = 6,979. ERROR OGG-01668 rp0.prm: PROCESS ABENDING. WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26951: table "GZ"."B1" has column data type not supported by conflict resolution ORA-26786: A row with key ("I1") = (6501) exists but has conflicting column(s) "D1", "I2" in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 0, RBA 5859 in Integrated mode. REPLICAT will retry in Direct mode. INFO OGG-08549 Oracle GoldenGate Capture for Oracle, ex0.prm: 17 records processed as of 2021-04-11 18:25:41.235068 (rate 0, delta 0). WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26951: table "GZ"."B1" has column data type not supported by conflict resolution ORA-26786: A row with key ("I1") = (6501) exists but has conflicting column(s) "I2" in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 0, RBA 6230 in Integrated mode. REPLICAT will retry in Direct mode. INFO OGG-08549 Oracle GoldenGate Capture for Oracle, ex0.prm: 19 records processed as of 2021-04-11 20:31:01.611752 (rate 0, delta 0). WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26951: table "GZ"."B1" has column data type not supported by conflict resolution ORA-26786: A row with key ("I1") = (6501) exists but has conflicting column(s) "D1", "I2" in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 0, RBA 6600 in Integrated mode. REPLICAT will retry in Direct mode. INFO OGG-00987 Oracle GoldenGate Command Interpreter for Oracle: GGSCI command (oracle): edit param rp0. INFO OGG-08549 Oracle GoldenGate Capture for Oracle, ex0.prm: 21 records processed as of 2021-04-11 20:36:49.705521 (rate 0, delta 0). WARNING OGG-02544 rp0.prm: Unhandled error (ORA-26786: A row with key ("I1") = (6501) exists but has conflicting column(s) "D1", "I2" in table GZ.B1 ORA-01403: no data found) while processing the record at SEQNO 0, RBA 6727 in Integrated mode. REPLICAT will retry in Direct mode.
最后修改时间:2021-04-11 22:52:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论