OGG的REP进程对主键列加1的处理

本文探讨了在Oracle环境下,使用HVR复制工具时遇到的主键更新问题及解决方案。介绍了通过调整表的主键属性并使用Goldengate的HANDLETPKUPDATE参数,以及在Oracle 11.2.0.3版本中利用DBMS_XSTREAM_GG存储过程来避免更新冲突的方法。

本文是转载,原文作者震总,他是Oracle database, OGG,HVR方面的资深工程师。

问题说明

对于表的主键列进行更新时,如果更新语句为set x=x+n或者更新过程中涉及到主键值的偏移,这种事务在源端可以正常执行,因为更新操作是在同一个语句中完成的。而对于HVR目标端来说,可能会把源端的一个更新语句转换为多个更新语句如:

目标端在执行上面的语句时会触发主键约束而报错:

ORA-00001: unique constraint (WZTEST.SYS_C005212) violated

Goldengate处理方式

Oracle 11.2.0.2之前可以使用HANDLETPKUPDATE参数来解决,报错问题。

不过这个参数的使用有一个限制条件,就是对应表的主键要修改成deferrable状态。

alter table WZTEST.TB

  drop constraint SYS_C005213 cascade;

alter table WZTEST.TB

  add primary key (ID)

  deferrable;

这只是一种临时的解决办法,当主键表太多时就不太适用了。

 

参数HANDLETPKUPDATE的使用方式

replicat reppart

setenv ( NLS_LANG =  "AMERICAN_AMERICA.ZHS16GBK" )

 

assumetargetdefs

userid goldengate, password oracleoracle

DBOPTIONS DEFERREFCONST, SUPPRESSTRIGGERS

gettruncates

ALLOWNOOPUPDATES

ddl include mapped

 

discardfile ./dirrpt/reppart.dsc, purge, megabytes 5000

 

MAP WZTEST.*,            target  WZTEST.*, HANDLETPKUPDATE;

 

通过10046跟踪可以得到goldengate应用进程在执行对pkupdate前后会执行下面的两个语句。执行更新操作前它会把constraint设置为deferred状态,更新完成之后,再设置成immediate状态。

 

alter session set constraint = deferred

 

UPDATE /*+ RESTRICT_ALL_REF_CONS */ "WZTEST"."TB" SET "ID" = :a1 WHERE "ID" = :b0 AND rowid <> :rid

 

alter session set constraint = immediate

 

 

Oracle 11.2.0.3中的处理方式

Oracle11.2.0.3的存储过程DBMS_XSTREAM_GG.ENABLE_TDUP_WORKSPACE可以解决这个问题,使用这个存储过程不再需要对表的主键状态进行修改,也不需要在Goldengate的参数文件中使用handletpkupdate参数。

 

这个存储过程是数据库自带的,即使没有部署Goldengate 数据库中也有这个存储过程。

 

通过10046可以看到goldengate的应用进程中显示了调用了dbms_xstream_gg.enable_tdup_workspacedbms_xstream_gg.disable_tdup_workspace两个存储过程。

 

begin dbms_xstream_gg.enable_tdup_workspace; end;

update …

begin dbms_xstream_gg.disable_tdup_workspace; end;

 

这两个存储过程在数据库中是加密的,具体的实现,不得而知。

 

参考文档:

GoldenGate REPLICAT abend ORA-00001: unique constraint violated on transient PKUpdate in 11.2.0.4 (Doc ID 1928263.1)

Usage of Handletpkupdate requires specific defer settings on table (Doc ID 1303231.1)

Oracle® GoldenGate Windows and UNIX Reference Guide 11g Release 2 Patch Set 1 (11.2.1.0.1)

### Ogg 复制进程参数配置及 Ogg-10143 错误解决方法 #### 1. Ogg 复制进程参数配置 在 Oracle GoldenGate 环境中,复制进程Replicat)的参数配置对数据同步和复制的性能与稳定性至关重要。以下是一些关键参数及其作用: - **TARGETDB**:定义目标数据库连接信息,例如用户、密码和连接字符串。 - **MAP**:指定源表到目标表的映射规则,确保数据正确映射[^3]。 - **ASSUMETARGETDEFS**:假设目标表结构与源表一致,避免因表结构差异导致的错误。 - **HANDLECOLLISIONS**:处理主键冲突的情况,允许覆盖或忽略冲突记录。 - **BATCHSQL**:启用批量 SQL 执行,提升性能,特别是在大规模数据插入时。 示例配置文件内容如下: ```plaintext REPLICAT REP_HY1 TARGETDB LIBFILE libggjava.so SET property=oracle MAP SRC_SCHEMA.SRC_TABLE, TARGET DST_SCHEMA.DST_TABLE, ASSUMETARGETDEFS. ``` 上述配置中,`ASSUMETARGETDEFS` 参数假设目标表结构与源表一致,可以有效避免因表结构变更引起的错误[^3]。 #### 2. Ogg-10143 错误解决方法 虽然 Ogg-10143 并未明确出现在官方文档中,但根据类似错误代码的经验,该问题可能与数据类型不匹配或字段长度不足相关。以下是可能的解决方案: - **检查日志文件**:通过查看 GoldenGate 的 `report` 和 `error` 日志文件,定位具体的错误描述和上下文信息[^3]。 - **验证表结构一致性**:确认源表和目标表的字段定义是否一致,特别是字段类型和长度。如果发现不一致,需调整目标表结构以匹配源表。 - **重启进程**:停止并重新启动受影响的 Extract 和 Replicat 进程,以清除可能的临时状态问题[^1]。 示例命令如下: ```bash # 停止 Extract 和 Replicat 进程 ./ggsci <<EOF STOP EXTRACT EXT_HY1 STOP REPLICAT REP_HY1 EOF # 启动 Extract 和 Replicat 进程 ./ggsci <<EOF START EXTRACT EXT_HY1 START REPLICAT REP_HY1 EOF ``` 此外,如果需要从最新记录开始读取以跳过错误事务,可以通过以下方式设置: ```bash # 设置从最新记录开始读取 ./ggsci <<EOF ALTER EXTRACT EXT_HY1, BEGIN NOW EOF ``` 这种方法可能会导致部分数据丢失,因此需谨慎使用[^1]。 #### 3. 其他注意事项 - 在进行任何结构调整或进程重启之前,建议备份相关配置文件和数据。 - 如果问题仍未解决,可参考 Oracle 官方文档或联系技术支持团队获取进一步帮助[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值