GoldenGate OGG-01296

错误信息:

WARNING OGG-01154  Oracle GoldenGate Delivery for Oracle, repyxb.prm:  SQL error 1403 mapping SGPM.P_SMS_SEND to SGPM.P_SMS_SEND.

WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, repyxb.prm:  Repositioning to rba 2509817 in seqno 1.

ERROR   OGG-01296  Oracle GoldenGate Delivery for Oracle, repyxb.prm:  Error mapping from SGPM.P_SMS_SEND to SGPM.P_SMS_SEND.

ERROR   OGG-01668  Oracle GoldenGate Delivery for Oracle, repyxb.prm:  PROCESS ABENDING.

原因分析:由于源端进行了表结构更改,没有通知目标端,导致此错误

处理方法:

  • 先确认两端表结构是否一致
  • 在源端查看附加日志是否enable

GGSCI>INFO TRANDATA schema.table_name

–返回应该是enable,如果不是,重新添加

GGSCI>ADD TRANDATA schema.table_name

  • 目标端数据库:触发器,约束,job等是否已经禁止
  • 查看discard文件(./dirrpt/xxx.dsc)中的相关描述
  • 使用logdump查看实际数据,分析原因

 

 

使用Oracle GoldenGate 的迁移/升级数据库的例子

本文永久地址 https://www.askmac.cn/?p=16819

 

 

  • 通过引入GoldenGate所带来的实际成绩与效果
  • 迁移/升级所需要的东西以及产生的问题
  • 作为解决问题的途径之一的 GoldenGate

–减少停机时间

–迁移切换后的切回

–迁移阶段/确认阶段/并行执行

 

迁移/更新的结果

实际成绩与效果

在机器上计算需要30分钟的切换停止时间缩短为6分钟

成功大幅减少由于减少停机时间锁造成的机会损失

可以在10分钟之内切回之前认为无法实现的切回。

估计人工可以在144人/月的一半以下(有GoldenGate 相关的追加)

通过有效活用资源,成功减少成本

不需要购入、架构用于保存、实验ST的18台机器

成功将偶然性风险限制在最小

 

灵活使用经验

实现必要条件解决问题实际成绩与效果

「最小化机会损失」「风险最小化」「缩减成本」

  • 有怎样的必要条件以及课题?
  • 怎样解决、实现的?

–为了实现目的所需要的结构

–围绕着解决所采取的idea以及tips

为何这么麻烦而困难?

 

迁移/更新的需求以及产生的问题

项目概要

  • 项目概要:

–伴随着机器变更的版本提升

  • 升级的范围:

–OS/DB/Middleware/外部机器等

  • DB相关的结构:

–4节点Oracle Real Application Cluster

  • 应用特性:

–24小时365日online

  • 其他:

–迁移时机中的应用没有更改

 

oggz1

项目中的迁移需求

目标与实现

项目中的迁移需求

 

实际成绩以及结果的考察

需求・问题以及 GoldenGate

  • 可以一口气解决多个需求问题的有潜力的产品
  • 根据技术人员idea可以扩展可能性的产品
  • 如何高效使用、如何解决问题以及需求

关于到底应该如何活用GoldeGate的具体内容

我将介绍使用案例image

 

缩短停机时间

  • 定义停机时间
  • 缩短停机时间的途径
  • 事例中实际应用的整体图

迁移任务以及停机时间

为何需要较长的停机时间

为了保障所做的各种操作所需要的时间

  • 行迁移需要较长时间
  • 依赖数据量以及环境数、尺寸等会增加
  • 迁移后确认所需要的时间

停机时间是指什么
无法提供服务的期间
服务停止到重新启动的时间,那么为何需要停止服务呢?

oggz2

 

迁移任务以及停机时间

缩短的途径

oggz3

  • 缩短停机时间的途径
    • 从当天的工作中去除
      • 从关键路径中排除
  • 缩短当天作业
    • 分割・并行・自动化・最优化

 

缩短途径后的image

oggz4

 

实现执行数据前提

将任务Serialize化的理由

考察问题点

oggz5

数据迁移以及停机

一些较难实现的要点

  • 需要识别同步开始的要点
  • 需要仅仅抽出半自动差分事务(数据)
  • 对于重复事务(数据)的需要认真设计以及控制
  • 控制的设计较难

 

为了实现的结构

GoldenGate 的增量同步

  • 可以同步特定时间以及事务后的数据

–实现对大量时间进行初期迁移/执行更新

  • 可以解决重复事务(HANDLECOLLISIONS)
  • 指定的schema以及对象,可以通过详细分割列以及行等来实现同步

 

oggz6

oggz7

HANDLECOLLISIONS 参数

  • 试着解决重复记录、失踪记录的错误
  • 检测重复记录・错误

–由于变更记录的造成的覆盖(我们判断为适用变更更加安全)

  • 检测失踪数据、错误

–排除变更记录

 

No. 1 2 3 4 5 6 7 8
Source  发行操作 Update
PK
Update
PK
Update
PK以外
Update
PK以外
Insert Insert Delete Delete
Target 同样的Key

有没有记录

没有 没有 没有 没有
OGG Replicat的操作

(一般操作)

对Insert 变更

(一般操作)

舍弃Update 对Update变更

(一般操作)

(一般操作)

舍弃Delete (内部解决Err )

※ 这是有主key的操作概要。主key相关的需要考虑的问题请参考以下内容。

对于没有「KROWN# 153607 [GG]主key、唯一key的表,请注意使用HANDLECOLLISIONS

 

oggz8

 

数据迁移以及停机时间

较难实现的要点

  • 需要识别同步开始的要点
  • 需要仅仅抽出半自动差分事务(数据)
  • 对于重复事务(数据)的需要认真设计以及控制
  • 控制的设计较难
  • 活用GoldenGate 来轻松地使用

 

解决问题以及GoldenGate

事先执行数据迁移

活用GoldenGate 的结构可以简单安装

仅对增量Transaction

从关键路径中排除数据迁移

不需要设计增量抽出,以及精细制作

 

oggz9

事先执行数据完整性比较

 

将任务Serialize化的理由

考察问题点

oggz10

比较完整性以及停机时间

比较难实现的要点

  • 需要比较、确认完整性的断面使其一致

–要用怎样的单位来比较

–处理中的事务该如何处置?(提供24小时服务)

 

oggz11

 

为了实现的结构

Database 以及 GoldenGate

oggz12

 

GoldenGate Tokens 选项

设定时操作的概要

  • 对于已指定的对象,可以抽出 Oracle DB SCN (Source DB 側)

–通过设置,可以在Trail文件中输出被 Capture的Source中的 SCN

– 使用Logdump Utility可以确认 Token 信息

–指定通过其他的工具等获得的 SCN来使用时,就需要考虑到使用工具时需要注意的问题

oggz13

DatabaseFlashback Query 技术

使用时的操作概要

可以参考过去的时间点中的数据

  • 在内部使用UNDO表区域

–对表结构的变更无法返回等限制于回滚表相同

  • 仅供参考不可更新

–可以参考已经被删除的行数据(DELETE)

 

oggz14

 

迁移任务与停机时间

比较难以实现的要点

  • 需要使得比较的断面一致(完整性确认)

–到底该用怎样的单位比较

–处理中的事务该如何处置

  • 通过活用Database以及GoldenGate 的结构来实现

 

解决问题以及GoldenGate

事先执行数据迁移

活用GoldenGate 的结构可以简单安装

仅对增量Transaction

从关键路径中排除数据迁移

不需要设计增量抽出,以及精细制作

 

oggz15

 

切换前迁移的整体情况

考虑到了缩短停机时间的设计

事先执行数据迁移以及完整性比较

oggz16

 

迁移切换完成后的切回

  • 需要切回的任务
  • 事例中的整体情况

 

难以切回的原因

考察问题

  • 难以获得切换以后的差分数据的同步
  • 执行数据整体迁移(返回)时,需要花费较长时间

 

oggz17

迁移任务以及切回

切回所需要的时间

=([现≫新] 切换以后的数据同步) + (② 切换工作)

 

① 表示通过GoldenGate 增量同步已经解决了。

 

重新连载为了实现的结构

  • 可以同步指定时间以及事务以后的数据

–事先对大量数据进行初始迁移/执行更新

  • 可以解决重复事务(HANDLECOLLISIONS)
  • 可以同步指定的schema以及object等数据

oggz18

回切的整体情况

考虑到切回的设计

oggz19

 

移动阶段确认阶段并行执行

  • 通过阶段性的执行来降低风险
  • 事例中实际的整体情况

 

迁移相关的风险对策

风险是什么,具体能做到哪一步

  • 将风险最小化、分散化

–担心性能恶化

  • 与正式环境相同的状态下是否可以测试(环境・规格・数据)
  • 是否可以以日期为间隔测试系统循环

–担心是否是人为错误

  • 是否可以分割切换,进行阶段性的发行
  • 是否可以以会发生错误为前提,将影响控制到最小

–DB以外的问题的担心

  • DB以外的服务器是否无法提前切换

 

考虑到阶段性迁移/并行执行的设计

在新的正式环境中使用测试

ogg20

 

考虑了阶段迁移/并行执行的设计

一个个执行对新正式环境的切换

oggz20

oggz21

 

 

oggz22

 

迁移相关的风险对策

将风险最小化、分散化

–担心性能恶化   à测试新的正式环境

  • 与正式环境相同的状态下是否可以测试(环境・规格・数据)
  • 是否可以以日期为间隔测试系统循环

–担心是否是人为错误à出现对新环境的切换、一个个执行业务

  • 是否可以分割切换,进行阶段性的发行
  • 是否可以以会发生错误为前提,将影响控制到最小

–DB以外的问题的担心à对一个个的layer执行新环境的切换

  • DB以外的服务器是否无法提前切换

 

作为问题解决途径的GoldenGate

迁移相关的风险对策

将风险最小化、分散化

–担心性能恶化   à测试新的正式环境

  • 与正式环境相同的状态下是否可以测试(环境・规格・数据)
  • 是否可以以日期为间隔测试系统循环

–担心是否是人为错误à出现对新环境的切换、一个个执行业务

  • 是否可以分割切换,进行阶段性的发行
  • 是否可以以会发生错误为前提,将影响控制到最小

–DB以外的问题的担心à对一个个的layer执行新环境的切换

  • DB以外的服务器是否无法提前切换

 

作为问题解决途径的GoldenGate

通过GoldenGate来一口气解决多个需求与问题

  • 减少停机时间
  • 迁移切换后的切回
  • 阶段性迁移/阶段性确认/并行运行

通过高效使用GoldenGate

成功实现迁移/更新

 

咨询服务的介绍

本公司的共享的过往成果

  • GoldenGate案例中的情况

–几乎所有的案例中都导入/采用了咨询服务

–我们有与Partner合作进行导入的经历

  • 主要可以对应的案例(参考)

–用于导入的案例,事先获得PoC的技术支援

–共享在实际项目中累积的经验

–在设计/实际运用中各种Review支援

–详细的参数设计以及使用设计、测试(性能/故障)的支援

–实时性等SLA需求对severe的案例的支持

–对象是旧版本的Oracle Database时

–迁移时的切回相关的设计支持

 

 

咨询支持的模型范围

 

oggz23

 

了解GoldenGate中LAG的含义

GGSCI中显示的LAG代表 事务被写入到磁盘介质中的时刻例如Oracle中redo被写入到online redo logfile中 和 Replicat将同一个事务分发到目标数据库的时刻 之间的时间间隔。

 

通俗地说,一个事务内的所有行记录将对应同一个LAG; 除非出现了一个事务被打散且被多个REPLICAT分别apply或者变成多个事务的情况。 OGG参数例如RANGE这种对应于第一种情况,即一个事务被多个REPLICATE分别APPLY。 OGG参数MAXTRANSOPS对应后一种情况。

 

LAG在以下情况中被引入:

 

  1. 当Extract进程在读取redolog并写出到TRAIL或REMOTE HOST
  2. 当额外的datapump在读取extract trail并通过网络写出到远程节点REMOTE HOST
  3. 当collector在目标服务器上接受网络数据并写出到LOCAL TRAIL
  4. 当REPLICAT读取LOCAL TRAIL并写出到数据库中

 

 

同时也需要注意通过GGSCI中INFO或STATUS等命令显示的LAG,或通过SEND 对象名,LAG命令获得的LAG可能不一致:

 

INFO命令所获得的LAG可能与SEND命令所得值存在小的差别

INFO命令获得的LAG返回自MANAGER来源于最近记录的checkpoint

SEND <OBJECT>, lag获得的LAG值基于<OBJECT>正在处理的行记录的时间戳

LAG常使用时间单位或需要处理的数据单位Kilobytes来表达

 

归根结底LAG是衡量 数据归档或写出到日志的时间 和 EXTRACT/PUMP/REPLICAT处理该数据的时刻 这2个时间点之间的差距, 而不是说 LAG反映了EXTRACT还要工作多久。

 

实际EXTRACT/PUMP/REPLICAT都不知道自己要工作多久才能追上 REAL TIME,它们的LAG值只是显示 最近它们处理的一条记录的时间 和这条记录被写到REDO LOG的时间点之间的差距,即LAG只说明ER之前的工作延迟,不代表还要工作多久才能追平。

 

举个例子来说,STOP EXTRACT之后等待一段时间再重启看到有很大的LAG,这不代表EXTRACT有什么问题,只是EXTRACT最后处理的一条记录 很早就在REDO LOG里生成了 而EXTRACT真正处理这条记录是等了一段时间的而已。

 

 

 

 

 

 

 

GGSCI (XIANGBLI-CN) 27> stop load2

 

Sending STOP request to EXTRACT LOAD2 …

Request processed.

 

 

GGSCI (XIANGBLI-CN) 28> start load2

 

Sending START request to MANAGER …

EXTRACT LOAD2 starting

 

GGSCI (XIANGBLI-CN) 31> info load2

 

EXTRACT    LOAD2     Last Started 2012-09-18 20:26   Status RUNNING

Checkpoint Lag       00:04:34 (updated 00:00:08 ago)

Log Read Checkpoint  Oracle Redo Logs

2012-09-18 20:21:32  Seqno 44, RBA 13750272

SCN 0.1845479 (1845479)

 

 

GGSCI (XIANGBLI-CN) 35> lag load2

 

Sending GETLAG request to EXTRACT LOAD2 …

Last record lag: 130 seconds.

At EOF, no more records to process.

 

GGSCI (XIANGBLI-CN) 36> info load2

 

EXTRACT    LOAD2     Last Started 2012-09-18 20:26   Status RUNNING

Checkpoint Lag       00:00:00 (updated 00:00:02 ago)

Log Read Checkpoint  Oracle Redo Logs

2012-09-18 20:27:33  Seqno 44, RBA 13817856

SCN 0.1845671 (1845671)

 

 

以上可以看到 Last record lag 和 Checkpoint Lag 是不同的

 

 

EXTRACT/PUMP/REPLICAT 没法预知自己什么时候能追平(catch up), 为什么? 因为虽然看上去可能有几十个GB的redo要处理,但是实际符合EXTRACT/PUMP/REPLICAT 要的记录可能很少。

 

 

又由于INFO的LAG是基于checkpoint的,所以如果出现大事务的情况Long Running Transactions (LRTs),事务可能长时间不提交COMMIT。 该事务可能变成一个最老而又最无聊的数据由于一直不COMMIT而无法写出。 这将造成EXTRACT/PUMP/REPLICAT实际处理这个大事务的时间点远落后于该大事务实际commit的时间点。 对于REPLICAT可以使用MAXTRANSOPS 参数来减少LAG。

了解GoldenGate Replicat的HANDLECOLLISIONS参数

HANDLECOLLISIONS是我们使用goldengate过程中常有的一个REPLICAT参数,该参数依赖于主键或唯一索引处理冲突数据,常用于初始化阶段。对于无主键或唯一索引的表无法处理冲突,且可能导致重复记录。注意打开此参数则所有数据错误不管reperror如何配置均不再写discard文件,即所有数据冲突信息被默认规则处理,没有任何日志(则会忽略error mapping数据错误,而且不会报告到discard文件),因此日常复制不建议使用该参数;可予以考虑的特殊场景为只需新增数据,无需复制历史数据。

 

使用HANDLECOLLISIONS的几个场景:

  1. target丢失delete记录(missing delete),忽略该问题并不记录到discardfile
  2. target丢失update记录(missing update)
    • 更新的键值是主键=》 update转换成INSERT ,默认情况下插入记录不完整
    • 更新的键值是非主键=》 忽略该问题并不记录到discardfile
  3. 重复插入已存在的主键值到target表中,这将被replicat转换为UPDATE现有主键值的行的其他非主键列

情景1 target丢失delete记录(missing delete) :

C:\Users\ML>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Tue Sep 18 13:38:03 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> conn sender/oracle
Connected.
SQL> create table handlec(t1 int primary key,t2 int);

Table created.

SQL> insert into handlec values(1,2);

1 row created.

SQL> insert into handlec values(3,2);

1 row created.

SQL> insert into handlec values(4,2);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from handlec;

        T1         T2
---------- ----------
         1          2
         3          2
         4          2

target :

SQL> conn receiver/oracle
Connected.
SQL> create table handlec(t1 int primary key,t2 int);

Table created.

SQL> insert into handlec values(1,2);

1 row created.

SQL> commit;

SQL> select * from handlec;

        T1         T2
---------- ----------
         1          2

SQL>

GGSCI (XIANGBLI-CN) 1> alter extract load2 , begin now
EXTRACT altered.

GGSCI (XIANGBLI-CN) 4> alter replicat rep2, begin now
REPLICAT altered.

GGSCI (XIANGBLI-CN) 13> add trandata sender.*

Logging of supplemental redo data enabled for table SENDER.HANDLEC.

Logging of supplemental redo log data is already enabled for table SENDER.TV.

GGSCI (XIANGBLI-CN) 14> start mgr
MGR is already running.

GGSCI (XIANGBLI-CN) 15> start er *

Sending START request to MANAGER ...
EXTRACT LOAD2 starting

Sending START request to MANAGER ...
REPLICAT REP2 starting

GGSCI (XIANGBLI-CN) 16> info all

Program     Status      Group       Lag at Chkpt  Time Since Chkpt

MANAGER     RUNNING
EXTRACT     RUNNING     LOAD2       00:00:00      00:00:01
REPLICAT    RUNNING     REP2        00:00:00      00:00:08

***SOURCE端删除一条TARGET没有的数据

SQL> delete handlec where t1=3;

1 row deleted.

SQL> commit;

Commit complete.

出现SQL error 1403错误,REPLICAT ABORT

2012-09-18 13:45:48  WARNING OGG-01004  Aborted grouped transaction on 'RECEIVER.HANDLEC', Database error 1403 (OCI Error ORA-01403: no data found, SQL ).

2012-09-18 13:45:48  WARNING OGG-01003  Repositioning to rba 1091 in seqno 3.

2012-09-18 13:45:48  WARNING OGG-01154  SQL error 1403 mapping SENDER.HANDLEC to RECEIVER.HANDLEC OCI Error ORA-01403: no data found, SQL .

2012-09-18 13:45:48  WARNING OGG-01003  Repositioning to rba 1091 in seqno 3.

Source Context :
  SourceModule            : [er.errors]
  SourceID                : [er/errors.cpp]
  SourceFunction          : [take_rep_err_action]
  SourceLine              : [623]
  ThreadBacktrace         : [8] elements
                          : [D:\ogg\V34342-01\gglog.dll(??1CContextItem@@UEAA@XZ+0x3272) [0x000000018010BDD2]]
                          : [D:\ogg\V34342-01\gglog.dll(?_MSG_ERR_MAP_TO_TANDEM_FAILED@@YAPEAVCMessage@@PEAVCSourceContext@@AEBV?$CQualDBObjName@$00@ggapp@gglib@ggs@@1W4MessageDisposition@CMessageFactory@@@Z+0x138) [0x00000001800AD508]]
                          : [D:\ogg\V34342-01\replicat.exe(ERCALLBACK+0x6e1e) [0x0000000140099D5E]]
                          : [D:\ogg\V34342-01\replicat.exe(shutdownMonitoring+0x4411) [0x00000001400C9BE1]]
                          : [D:\ogg\V34342-01\replicat.exe(shutdownMonitoring+0x289cd) [0x00000001400EE19D]]
                          : [D:\ogg\V34342-01\replicat.exe(CommonLexerNewSSD+0x9440) [0x00000001402AE980]]
                          : [C:\windows\system32\kernel32.dll(BaseThreadInitThunk+0xd) [0x000000007733652D]]
                          : [C:\windows\SYSTEM32\ntdll.dll(RtlUserThreadStart+0x21) [0x000000007746C521]]

2012-09-18 13:45:48  ERROR   OGG-01296  Error mapping from SENDER.HANDLEC to RECEIVER.HANDLEC.

***********************************************************************
*                   ** Run Time Statistics **                         *
***********************************************************************

Last record for the last committed transaction is the following: 
___________________________________________________________________
Trail name :  D:\ogg\V34342-01\ex\ze000003
Hdr-Ind    :     E  (x45)     Partition  :     .  (x04) 
UndoFlag   :     .  (x00)     BeforeAfter:     B  (x42) 
RecLength  :     9 (x0009)    IO Time    : 2012-09-18 13:45:38.000000  
IOType     :     3  (x03)     OrigNode   :   255  (xff)
TransInd   :     .  (x03)     FormatType :     R  (x52)
SyskeyLen  :     0  (x00)     Incomplete :     .  (x00)
AuditRBA   :         44       AuditPos   : 3337232
Continued  :     N  (x00)     RecCount   :     1  (x01)

2012-09-18 13:45:38.000000 Delete             Len     9 RBA 1091
Name: SENDER.HANDLEC
___________________________________________________________________

Reading D:\ogg\V34342-01\ex\ze000003, current RBA 1091, 0 records

Report at 2012-09-18 13:45:48 (activity since 2012-09-18 13:45:48)

From Table SENDER.HANDLEC to RECEIVER.HANDLEC:
       #                   inserts:         0
       #                   updates:         0
       #                   deletes:         0
       #                  discards:         1

Last log location read:
     FILE:      D:\ogg\V34342-01\ex\ze000003
     SEQNO:     3
     RBA:       1091
     TIMESTAMP: 2012-09-18 13:45:38.000000
     EOF:       NO
     READERR:   0

2012-09-18 13:45:48  ERROR   OGG-01668  PROCESS ABENDING.

2012-09-18 13:45:48  INFO    OGG-01237  Trace file D:\ogg\V34342-01\REP_TRACE1.TRC closed.

2012-09-18 13:45:48  INFO    OGG-01237  Trace file D:\ogg\V34342-01\REP_TRACE2.TRC closed.

CACHE OBJECT MANAGER statistics

CACHE MANAGER VM USAGE
vm current     =      0    vm anon queues =      0 
vm anon in use =      0    vm file        =      0 
vm used max    =      0    ==> CACHE BALANCED

CACHE CONFIGURATION
cache size       =   2G   cache force paging = 3.41G
buffer min       =  64K   buffer highwater   =   8M
pageout eligible size =   8M

================================================================================

使用skiptransaction跳过上述失败事务

GGSCI (XIANGBLI-CN) 18> start rep2 skiptransaction

Sending START request to MANAGER ...
REPLICAT REP2 starting

 

 

 

 

情景2 target丢失update记录(missing update),更新的键值是主键 :

 

 

继续我们的测试, 针对source的某条记录进行更新

SQL> update handlec set t1=5 where t1=4;

1 row updated.

SQL> commit;

Commit complete.

对于在target 丢失更新(miss update)的情况也会造成 Database error 1403+OGG-01296

2012-09-18 13:49:30  WARNING OGG-01004  Aborted grouped transaction on 'RECEIVER.HANDLEC', Database error 1403 (OCI Error ORA-01403: no data found, SQL <UPDATE "RECEIVER"."HANDLEC" SET "T1" = :a1 WHERE "T1" = :b0>).

2012-09-18 13:49:30  WARNING OGG-01003  Repositioning to rba 1218 in seqno 3.

2012-09-18 13:49:30  WARNING OGG-01003  Repositioning to rba 1218 in seqno 3.

Source Context :
  SourceModule            : [er.errors]
  SourceID                : [er/errors.cpp]
  SourceFunction          : [take_rep_err_action]
  SourceLine              : [623]
  ThreadBacktrace         : [8] elements
                          : [D:\ogg\V34342-01\gglog.dll(??1CContextItem@@UEAA@XZ+0x3272) [0x000000018010BDD2]]
                          : [D:\ogg\V34342-01\gglog.dll(?_MSG_ERR_MAP_TO_TANDEM_FAILED@@YAPEAVCMessage@@PEAVCSourceContext@@AEBV?$CQualDBObjName@$00@ggapp@gglib@ggs@@1W4MessageDisposition@CMessageFactory@@@Z+0x138) [0x00000001800AD508]]
                          : [D:\ogg\V34342-01\replicat.exe(ERCALLBACK+0x6e1e) [0x0000000140099D5E]]
                          : [D:\ogg\V34342-01\replicat.exe(shutdownMonitoring+0x4411) [0x00000001400C9BE1]]
                          : [D:\ogg\V34342-01\replicat.exe(shutdownMonitoring+0x289cd) [0x00000001400EE19D]]
                          : [D:\ogg\V34342-01\replicat.exe(CommonLexerNewSSD+0x9440) [0x00000001402AE980]]
                          : [C:\windows\system32\kernel32.dll(BaseThreadInitThunk+0xd) [0x000000007733652D]]
                          : [C:\windows\SYSTEM32\ntdll.dll(RtlUserThreadStart+0x21) [0x000000007746C521]]

2012-09-18 13:49:30  ERROR   OGG-01296  Error mapping from SENDER.HANDLEC to RECEIVER.HANDLEC.

加入HANDLECOLLISIONS后,rep可以继续工作且不生成discard记录

GGSCI (XIANGBLI-CN) 23> view params rep2
replicat rep2
userid receiver , password oracle
trace ./rep_trace1.trc
trace2 ./rep_trace2.trc
ASSUMETARGETDEFS
HANDLECOLLISIONS
map sender.*, target receiver.*;

GGSCI (XIANGBLI-CN) 18> start rep2

SQL> select * from handlec;

        T1         T2
---------- ----------
         1          2
         5

 

 

 

这里出现T1=5 T2 NULL记录的原因是 ,丢失update的更新操作是针对主键的更新,此时replicat会尝试插入一条记录而非忽略该update。
注意插入的记录可能不是完整的行,如上例中的T2 为NULL ,若要求完整的行记录则要求EXTRACT使用PKUPDATE选项。

需要加入的选项是FETCHOPTIONS FETCHPKUPDATECOLS

将以上选项加入到EXTRACT参数文件中,并重启EXTRACT。 这将引起extract捕获完整的主键更新镜像。

如以下的例子:

SQL> conn receiver/oracle
Connected.
SQL> select * from handlec;

T1 T2
---------- ----------
1 2
10 100
5
20 200

SQL> delete handlec where t1=5;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select * from handlec;

T1 T2
---------- ----------
1 2
10 100
20 200

SQL> conn sender/oracle
Connected.

SQL> update handlec set t1=t1+1000 where t1=5;

1 row updated.

SQL> commit;

Commit complete.

SQL> conn receiver/oracle
Connected.
SQL>
SQL>
SQL> select * from handlec;

T1 T2
---------- ----------
1 2
10 100
20 200
1005 2

 

 

 

如上述实验验证FETCHOPTIONS FETCHPKUPDATECOLS将捕获完整的redo image镜像到trail中,这保证把primary key的更新通过HANDLECOLLISIONS转换为对target的一个完整记录的插入。

 

情景3 重复插入已存在的主键值到target表中,这将被replicat转换为UPDATE现有主键值的行的其他非主键列:

 

 

 

*** TARGET 

SQL> conn receiver/oracle
Connected.

SQL> select * from handlec;

        T1         T2
---------- ----------
         1          2
        10          9
		 5

target中已经存在 t1=10 t2=9的记录 ,此时再在source中插入(10,100)的记录

>>SOURCE

SQL> insert into handlec values(10,100);

1 row created.

SQL> commit;

>>TARGET

SQL> select * from handlec;

        T1         T2
---------- ----------
         1          2
        10        100
         5

上面可以看到在source的insert操作,因为在target中已有对应的主键记录所以被启用HANDLECOLLISIONS的REPLICAT转换为UPDATE非主键的其他COLUMNS

 

 

总结

 

HANDLECOLLISIONS是我们使用goldengate过程中常有的一个REPLICAT参数,该参数依赖于主键或唯一索引处理冲突数据,常用于初始化阶段。对于无主键或唯一索引的表无法处理冲突,且可能导致重复记录。注意打开此参数则所有数据错误不管reperror如何配置均不再写discard文件,即所有数据冲突信息被默认规则处理,没有任何日志,因此日常复制不建议使用该参数;可予以考虑的特殊场景为只需新增数据,无需复制历史数据。

 

使用HANDLECOLLISIONS的几个场景:

  1. target丢失delete记录(missing delete),忽略该问题并不记录到discardfile
  2. target丢失update记录(missing update)
    • 更新的键值是主键=》 update转换成INSERT ,默认情况下插入记录不完整
    • 更新的键值是非主键=》 忽略该问题并不记录到discardfile
  3. 重复插入已存在的主键值到target表中,这将被replicat转换为UPDATE现有主键值的行的其他非主键列

另:该参数仅处理数据本身的Insert/Delete冲突,如果出现两端映射或其它结构性问题Replicat进程依然会abend,不能被忽略

 

此外对于主键的更新操作,若在target使用HANDLECOLLISIONS且该update丢失,在会转换为INSERT该主键的操作,注意默认情况下插入的记录不完整,FETCHOPTIONS FETCHPKUPDATECOLS将捕获完整的redo image镜像到trail中,这保证把primary key的更新通过HANDLECOLLISIONS转换为对target的一个完整记录的插入。

 

 

我们可以通过send 命令动态取消HANDLECOLLISIONS

GGSCI (XIANGBLI-CN) 29> send rep2, NOHANDLECOLLISIONS

Sending NOHANDLECOLLISIONS request to REPLICAT REP2 ...
REP2 NOHANDLECOLLISIONS set for 1 tables and 0 wildcard entries

Oracle Goldengate OGG 11g与各操作系统及数据库版本的兼容列表

Oracle Goldengate OGG 11g (11.1.1.0.0)与各操作系统及数据库版本的兼容列表如下,仅供参考:

 

Oracle GoldenGate Certification Matrix 11.1.1.0.0
Version Supported Processor Type OS Version OS
32/64 bit
Oracle FM
32/64 bit
JDK Vendor
Version*
JDK
32/64 bit
Oracle
Database*
Exceptions and Additional Information
11gR1 (11.1.1.1+) x86 Red Hat EL 4 (UL7+) 32 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15
MySQL 5.0
MySQL 5.1
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
11gR1 (11.1.1.1+) x86 Red Hat EL 5 (UL3+) 32 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15
MySQL 5.0
MySQL 5.1
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
11.1.1.0.0 x86 SLES 10 (SP1+) 32 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15
MySQL 5.0
MySQL 5.1
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
11.1.1.0.0 x86 Windows 2003 32 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
TimesTen 7.05
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
TimeTen supports Delivery only
11.1.1.0.0 x86 Windows XP Professional with SP3+ 32 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
TimesTen 7.05
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
TimeTen supports Delivery only
11.1.1.0.0 x64 Red Hat EL 4 (UL7+) 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
TimesTen 7.05
Teradata 12
Teradata 13

11.1.1.0.0 x64 Red Hat EL 5 (UL3+) 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
Teradata 12
Teradata 13

11.1.1.0.0 x64 SLES 10 (SP1+) 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
TimesTen 7.05
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
TimeTen supports Delivery only
11.1.1.0.0 x64 Windows 2003 with SP2/R2+ 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008
MySQL 5.0
MySQL 5.1
Sybase 12.5.4
Sybase 15
TimesTen 7.05
Teradata 12
Teradata 13
MySQL 5.0 supports Delivery only
TimeTen supports Delivery only
11.1.1.0.0 x64 Windows Server 2008 with SP1+ 64 NA NA NA Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
Sybase 12.5.4
Sybase 15
MySQL 5.0
MySQL 5.1
Teradata 12
Teradata 13
Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008

11.1.1.0.0 Itanium-2 Windows Server 2008 with SP1+ 64 NA NA NA Microsoft SQL Server 2000
Microsoft SQL Server 2005
Microsoft SQL Server 2008

11.1.1.0.0 SPARC Solaris 2.9 Update 9+ 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

11.1.1.0.0 SPARC Solaris 10 Update 4+ 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

11.1.1.0.0 PA-RISC HP-UX 11i (11.23)
B.11.23.0703.059a Base Quality Pack Bundle for HP-UX 11i v2, March 2007+
64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

11.1.1.0.0 PA-RISC HP-UX 11i (11.31)
B.11.31.0803.318a Base Quality Pack Bundle for HP-UX 11i v3, March 2008+
64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

11.1.1.0.0 Itanium-2 HP-UX 11i (11.23)
B.11.23.0703.059a Base Quality Pack Bundle for HP-UX 11i v2, March 2007+
64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7

11.1.1.0.0 POWER AIX 5.3 (TL8+) 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

11.1.1.0.0 POWER AIX 6.1 (TL2+) 64 NA NA NA Oracle 9.2.0.7+
Oracle 10.2.0.4+
Oracle 11.1.+
Oracle 11.2.+
IBM DB2 9.1
IBM DB2 9.5
IBM DB2 9.7
Sybase 12.5.4
Sybase 15

Oracle GoldenGate Monitor架构图

Oracle GoldenGate Monitor架构图

Oracle Goldengate Director软件截面图

Oracle Goldengate Director软件截面图

 

Officially GoldenGate was purchased by oracle in October 1, 2009

Officially GoldenGate was purchased by oracle in October 1, 2009

 

oracle by goldengate

Goldengate Parameter SUPPRESSTRIGGERS & DEFERREFCONST

 

SUPPRESSTRIGGERS

Trigger的抑制和Cascading Deletes

在复制的时候,由于应用以及Trigger会出现影响DB的一致性的情况
“SUPPRESSTRIGGERS”选项用于抑制在数据复制时对目标段对象的Trigger启动
DBOPTIONS SUPPRESSTRIGGERS

缺省值为不抑制 (NOSUPPRESSTRIGGERS)
可使用的DB版本
Oracle 10.2.0.5 以上
Oracle 11.2.0.2 以上
Replicat的用户必须有Streams的管理权限
dbms_goldengate_auth.grant_admin_privilege

 

DEFERREFCONST 约束生效的延迟

    • 可以用DEFERREFCONST选项来代替手动设置约束无效
      • Database 9.2.0.7以上
    • 一直到Replicat的事务提交、DEFERREFCONST会延迟完整性约束的确认与生效
    • DBOPTIONS DEFERREFCONST

      不支持的版本则会忽略DEFERREFCONST参数。忽略的话,也不会写GoldenGate的log。

 

 

DBOPTIONS SUPPRESSTRIGGERS for delete cascade constraint on the target side (REPLICAT) in 11.1.0.7 is missing.

Ct was using OGG ver 10.4 initially for replicating from 9.2.0.8 on Sun Solaris to 11.1.0.7 on AIX.
Ct ran into issues as they had 232 tables with 250 DELETE CASCADE constraints while replicating delete records.
We gave the recommendation of disabling the constraint which obviously worked but the ct does not want
to disable the constraint and involves lot of manual work.
In working thru’ the issues with GG support, it was mentioned that OGG ver 11.1. would have a parameter
that was to be set in the REPLICAT which would fix this issue.
In reading thru’ the Release notes
http://download.oracle.com/docs/cd/E18101_01/doc.1111/e18165.pdf
(Page 6).

the parameter SUPPRESSTRIGGERS is not available for 11gR1, 11.1.0.7.

I was adivsed to open an SR with GG support to check if there will be an additional build
on top of 11.1.1 so that this parameter becomes available for 11gR1. Otherwise the ct will not be
very happy as initially, we were told the ct that the parameter will be available for 11.1.0.7, but it didnt make it as per the doc.
If we can build the same for 11.1.0.7 it will go a long way in maintaining this high profile ct.

check the OGG v11 guides and ensure that you are looking for SUPPRESSTRIGGERS or DEFERREFCONST.

SUPPRESSTRIGGERS
********************
Valid for Replicat for Oracle. Prevents triggers from firing on target objects that are configured for replication with Oracle GoldenGate. You can use this parameter for Oracle 10.2.0.5 and later patches, and for Oracle 11.2.0.2 and later, instead of manually
disabling the triggers.

DEFERREFCONST
****************
Valid for Replicat for Oracle. Delays referential integrity constraint checking and enforcement by the database until the Replicat transaction is committed. You can use this parameter instead of disabling the constraints on the target tables if the database is
Oracle version 9.2.0.7 and later.

When coming to SUPPRESSTRIGGERS, we have some packages added to 10.2.0.5 or 11.2.0.2 and above. Those packages are needed for this to work.

For 10.2.0.5, we need to use dbms_streams_auth.grant_admin_privilege and For 11.2.0.2, we use dbms_goldengate_auth.grant_admin_privilege.

OGG-01154 SQL error 1400 cannot insert NULL into错误解析

2012-11-22 14:46:37 WARNING OGG-03504 NLS_LANG character set UTF8 on the target is different from the source database character se
t AL32UTF8. Replication may not be valid if the source data has an incompatible character for the target NLS_LANG character set.

2012-11-22 14:46:37 WARNING OGG-00869 Aborting BATCHSQL transaction. Detected inconsistent result: executed 1 operations in batch,
resulting in 0 affected rows.

2012-11-22 14:46:37 WARNING OGG-01137 BATCHSQL suspended, continuing in normal mode.

2012-11-22 14:46:37 WARNING OGG-01003 Repositioning to rba 2834 in seqno 0.

2012-11-22 14:46:37 WARNING OGG-00869 OCI Error ORA-01400: 无法将 NULL 插入 ("EP"."T_SYS_TASK"."ID") (status = 1400). INSERT INTO 
"EP"."T_SYS_TASK" ("ID","TASK_TYPE","UNIT_ID","START_TIME","STOP_TIME","STATUS","INFO_ID","TITLE","CONTENT","EXEC_START_TIME","EXEC_
STOP_TIME","ADDR_LIST_FILE","NOTICE_MAIL_ADDR","TASK_NAME","CREATOR_ID","CREATOR_TIME","AUDITOR_ID","AUDITOR_TIME","ADVICE") VALUES 
(:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15,:a16,:a17,:a18).

2012-11-22 14:46:37 WARNING OGG-01004 Aborted grouped transaction on 'EP.T_SYS_TASK', Database error 1400 (OCI Error ORA-01400: 无
法将 NULL 插入 ("EP"."T_SYS_TASK"."ID") (status = 1400). INSERT INTO "EP"."T_SYS_TASK" ("ID","TASK_TYPE","UNIT_ID","START_TIME","STO
P_TIME","STATUS","INFO_ID","TITLE","CONTENT","EXEC_START_TIME","EXEC_STOP_TIME","ADDR_LIST_FILE","NOTICE_MAIL_ADDR","TASK_NAME","CRE
ATOR_ID","CREATOR_TIME","AUDITOR_ID","AUDITOR_TIME","ADVICE") VALUES (:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a
14,:a15,:a16,:a17,:a18)).

2012-11-22 14:46:37 WARNING OGG-01003 Repositioning to rba 2834 in seqno 0.

2012-11-22 14:46:37 WARNING OGG-01154 SQL error 1400 mapping EP.T_SYS_TASK to EP.T_SYS_TASK 

OCI Error ORA-01400: 无法将 NULL 插入 
("EP"."T_SYS_TASK"."ID") (status = 1400). INSERT INTO "EP"."T_SYS_TASK" ("ID","TASK_TYPE","UNIT_ID","START_TIME","STOP_TIME","STATUS
","INFO_ID","TITLE","CONTENT","EXEC_START_TIME","EXEC_STOP_TIME","ADDR_LIST_FILE","NOTICE_MAIL_ADDR","TASK_NAME","CREATOR_ID","CREAT
OR_TIME","AUDITOR_ID","AUDITOR_TIME","ADVICE") VALUES (:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15,:a16,:a
17,:a18).

2012-11-22 14:46:37 WARNING OGG-01003 Repositioning to rba 2834 in seqno 0.
WARNING OGG-01396 A complete after image is not available in <schema.table> at rba 123456 in file ./dirdat/yyy, 
while inserting a row into <schema.table> due to missing target row for a key update operation. 
NOCOMPRESSUPDATES or FETCHOPTIONS FETCHPKUPDATECOLS 
may be specified in the EXTRACT parameter file to include a complete image for key update operations.

WARNING OGG-00869 OCI Error ORA-01400: cannot insert NULL into ("<schema>"."<table>"."<PK>") 
(status = 1400), SQL <INSERT INTO "<schema>"."<table>" ("<PK>",...) VALUES (:a0,:...)>.

2011-03-28 10:39:05 WARNING OGG-01004 Aborted grouped transaction on '<schema.table>', 
Database error 1400 (ORA-01400: cannot insert NULL into ("<schema>"."<table>"."<PK>")).

2011-03-28 10:39:05 WARNING OGG-01003 Repositioning to rba 123455 in seqno 678.

2011-03-28 10:39:05 WARNING OGG-01154 SQL error 1400 mapping <schema.table> to <schema.table> 

OCI Error ORA-01400: cannot insert NULL into ("<schema>"."<table>"."<PK>") (status = 1400), 
SQL <INSERT INTO "<schema>"."<table>" ("<PK>",...) VALUES (:a0,...)>.

2011-03-28 10:39:05 WARNING OGG-01003 Repositioning to rba 123455 in seqno 678.

Source Context :
SourceModule : [er.main]
SourceID : [/home/ecloud/workspace/Build_FBO_OpenSys_r11.1.1.0.0_078_[34093]/perforce/src/app/er/rep.c]
SourceFunction : [take_rep_err_action]
SourceLine : [15780]
ThreadBacktrace : [8] elements
: [/oradata/ogg/replicat(CMessageContext::AddThreadContext()+0x26) [0x5d9516]]
: [/oradata/ogg/replicat(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...)+0x7b2) [0x5cffb2]]
: [/oradata/ogg/replicat(_MSG_ERR_MAP_TO_TANDEM_FAILED(CSourceContext*, DBString<777> const&, 
DBString<777> const&, CMessageFactory::MessageDisposition)+0x9b) [0x57bd7b]]
: [/oradata/ogg/replicat [0x7df1a3]]
: [/oradata/ogg/replicat [0x8ac301]]
: [/oradata/ogg/replicat(main+0x1d30) [0x4f4b90]]
: [/lib64/libc.so.6(__libc_start_main+0xf4) [0x3fca01d994]]
: [/oradata/ogg/replicat(__gxx_personality_v0+0x1e2) [0x4d86ba]]

2011-03-28 10:39:05 ERROR OGG-01296 Error mapping from <schema.table> to <schema.table>.

 

 

OGG-01154 SQL error 1400 该错误常由replicat端使用了HANDLECOLLISIONS时(启用HANDLECOLLISIONS时 target丢失update记录(missing update)更新的键值是主键=》 update转换成INSERT ,默认情况下插入记录不完整,详见《了解GoldenGate Replicat的HANDLECOLLISIONS参数》)对于丢失的PK UPDATE转换为INSERT但是由于UPDATE记录未包含更新后的所有列的镜像而引起(if the PK is not available at target side, then this error is expected, because HANDLECOLLISIONS turns the PK update into an insert as result of no target record to update.The problem is that the source PK update record doesn’t contain all the after image columns. That is also expected because the update record is intended to only update the affected columns. )

有同学认为OGG-01154 SQL error 1400 是因为数据不一致引起的,这样说也有道理,因为如果说不丢失该PK记录则UPDATE不会转变为INSERT。

对于上述问题常见的Workaround方法是在 capture/extract端加入FETCHOPTIONS FETCHPKUPDATECOLS ,以便extract获取完整的记录更新后镜像,使得HANDLECOLLISIONS 正常工作将PK UPDATE转换为INSERT。

FETCHOPTIONS is an Extract parameter that controls certain aspects of the way that GoldenGate fetches data.

FETCHOPTIONS FETCHPKUPDATECOLS

needs to be added to extract parameter file and extract needs to be restarted. This will cause the extract to capture the full image for primary key update.

沪ICP备14014813号-2

沪公网安备 31010802001379号