OGG重复记录导致复制进程挂起

本文介绍了一次Oracle GoldenGate(OGG)复制过程中遇到的问题及解决方法。主要原因是目标表存在重复记录导致复制进程挂起。通过备份、删除重复记录并重新导入的方式解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天处理了个复制进程异常挂起的CASE,出错日志是:

2012-08-20 10:33:02  WARNING OGG-00869  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  No unique key is defined for table 'WL_PSINFO'. All viable columns will be used to represent the key, but may not guarantee uniqueness.  KEYCOLS may be used to define the key.
2012-08-20 10:34:12  WARNING OGG-01431  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  Aborted grouped transaction on 'MBS7_INV.WL_PSINFO', Mapping error.
2012-08-20 10:34:12  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  Repositioning to rba 124252822 in seqno 77.
2012-08-20 10:34:12  WARNING OGG-01151  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  Error mapping from MBS7_INV.WL_PSINFO to MBS7_INV.WL_PSINFO.
2012-08-20 10:34:12  WARNING OGG-01003  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  Repositioning to rba 124252822 in seqno 77.
2012-08-20 10:34:12  ERROR   OGG-01296  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  Error mapping from MBS7_INV.WL_PSINFO to MBS7_INV.WL_PSINFO.
2012-08-20 10:34:12  ERROR   OGG-01668  Oracle GoldenGate Delivery for Oracle, r_inv1.prm:  PROCESS ABENDING.

从日志看是该表缺少主键,但OGG也是可以基于无主键的情况下同步的,进一步分析目标表和结合挂起的时间,本来该表是无主键的,在发生异常前刚在源端做了创建主键的操作,而此时目标表是存在重复记录的:

目标端:

select id,ordercode, consigncode from mbs7_inv.WL_PSINFO group by id,
                ordercode, consigncode having count(*) > 1

.....有1千多条重复记录,而与此同时在源端是不存在重复记录。

进一步查询发现该表的重复记录只有前几个字段相同,后面几个字段还是不一样的:

select *
  from mbs7_inv.WL_PSINFO
 where id in
       (select id
          from (
select id,ordercode, consigncode from mbs7_inv.WL_PSINFO group by id,
                ordercode, consigncode having count(*) > 1)) order by id

所以不能用传统删除重复记录的方法来处理。

为了OGG进程能正常运作,打算先在源端备份这些删除掉的真实记录,然后在目标端做删除处理后再导入,处理方法是:

1 先在源端备份这些记录:

create table system.WL_PSINFO_bak   as select * from 
mbs7_inv.WL_PSINFO a  where a.id in 
(select id
          from (
select id,ordercode, consigncode from mbs7_inv.WL_PSINFO@link_102 group by id,
                ordercode, consigncode having count(*) > 1))

 

2 在目标端删除这些记录:

delete from mbs7_inv.WL_PSINFO a  where id in 
(
select id 
          from (
select id,ordercode, consigncode from mbs7_inv.WL_PSINFO group by id,
                ordercode, consigncode having count(*) > 1))

commit;

3 重新把源端备份的数据导回来:

insert into mbs7_inv.WL_PSINFO select * from system.WL_PSINFO_bak@link_100;

 

4 启动复制进程即可:

ggsci>start r_inv1

 

总结:主要是要理解OGG的复制原理,它是读日志或DDL同步表进行同步处理的,如果源端进行得动作,在目标端执行不了,为了保证数据一致性,OGG会让复制进程挂起,所要要结合警告日志和两边表结构情况来分析。

<think>我们正在处理一个关于Oracle GoldenGate的问题:用户想要在配置复制进程(Replicat)时指定一个特定的SCN(SystemChange Number)作为起点。根据Oracle GoldenGate的文档,我们可以通过为Replicat进程设置`STARTSCN`参数来实现这一点。这通常在创建Replicat进程时完成,可以通过添加一个`STARTSCN`子句在`ADDREPLICAT`命令中。具体步骤如下:1.在GoldenGate命令行界面(GGSCI)中,使用`ADDREPLICAT`命令创建Replicat进程,并在命令中指定`STARTSCN`。例如:```ADD REPLICATrep1, EXTRAIL ./dirdat/rt, STARTSCN<scn_number>```其中,`rep1`是Replicat进程的名称,`EXTRAIL`指定了trail文件的位置,`<scn_number>`是用户想要指定的SCN。2.如果Replicat进程已经存在,我们可以通过编辑参数文件,在参数文件中使用`STARTSCN`参数。但是注意,对于已经存在的Replicat进程,修改参数文件后需要重启进程。在参数文件中,我们可以这样写:```REPLICATrep1ASSUMETARGETDEFSSTARTSCN<scn_number>...```注意:`STARTSCN`参数告诉Replicat进程从指定的SCN开始读取trail文件中的记录。只有当trail文件中包含该SCN及之后的数据时,Replicat才能正常处理。因此,确保指定的SCN在trail文件中存在。另外,引用[1]中提到,如果主数据库实例停止或失败,Extract会异常终止(abend)。在这种情况下,如果我们需要将GoldenGate迁移到另一个节点上运行,需要先停止原节点上的Manager进程,然后在另一个节点上启动GoldenGate进程。这个场景虽然与指定SCN没有直接关系,但提醒我们在配置Replicat时,如果涉及到数据库实例的变更,需要注意这些步骤。引用[3]提到在初始加载(initial load)过程中,需要创建在线Extract和Replicat组,并在加载过程中启动这些组。这提示我们,指定SCN可能用于初始加载后的数据同步,确保从正确的点开始复制。因此,我们可以总结如下:要配置Replicat进程从特定的SCN开始,有两种方式:-在创建Replicat时使用`ADD REPLICAT`命令并指定`STARTSCN`选项。-在Replicat参数文件中使用`STARTSCN`参数。但请注意,如果使用参数文件方式,并且Replicat已经存在,修改参数文件后需要重启Replicat进程。下面我们给出一个具体的示例:假设我们要创建一个名为`rep1`的Replicat进程,指定从SCN12345678开始,trail文件为`./dirdat/rt`,则命令如下:``` ADDREPLICAT rep1,EXTRAIL ./dirdat/rt,STARTSCN12345678```或者,在参数文件中设置: ```REPLICAT rep1ASSUMETARGETDEFSSTARTSCN12345678MAPschema1.*, TARGET schema2.*;```然后启动Replicat进程(如果尚未启动)。注意:在指定SCN之前,确保该SCN在trail文件中存在。如果指定的SCN在trail文件中不存在,Replicat进程可能会在启动时报错。此外,用户可能需要知道如何获取一个特定的SCN。通常,SCN可以从数据库的某些视图中查询(如`v$database`的`CURRENT_SCN`),或者在导出数据时指定SCN(如引用[2]中的`flashback_scn`参数)。引用[2]中展示了一个使用数据泵导出时指定SCN的例子,这可以用于创建一致性的数据快照。在GoldenGate中,初始加载时也可以使用类似的方法,然后从该SCN开始进行变化捕获和复制。因此,用户可能是在进行初始加载后,想要从加载时使用的SCN开始复制后续的变化,那么就需要在Replicat中指定这个SCN。最后,我们生成相关问题:</think>### Oracle GoldenGate 配置 Replicat 从特定 SCN 启动 在 Oracle GoldenGate 中配置 Replicat 进程从特定 SCN(System Change Number)启动,可通过以下步骤实现: #### 📌 方法 1:创建 Replicat 时指定 SCN(推荐) ```sql -- 在 GGSCI 命令行执行 ADD REPLICAT <进程名>, EXTRAIL <路径>, STARTSCN <SCN值> ``` **示例**: ``` ADD REPLICAT rep_sales, EXTRAIL ./dirdat/rt, STARTSCN 12345678 ``` 此命令会创建一个名为 `rep_sales` 的 Replicat 进程,从 SCN 12345678 开始处理事务[^3]。 #### 📌 方法 2:修改参数文件 在 Replicat 参数文件(`dirprm/<进程名>.prm`)中添加: ```sql STARTSCN <SCN值> ``` **示例**: ```sql REPLICAT rep_orders ASSUMETARGETDEFS STARTSCN 98765432 -- 指定起始 SCN MAP hr.*, TARGET hr_repl.*; ``` #### ⚠️ 关键注意事项 1. **SCN 有效性** - 指定的 SCN 必须存在于 Trail 文件中,否则 Replicat 会报错 `SCN NOT FOUND` - 可通过 `logdump` 工具验证 Trail 文件中的 SCN 范围: ``` logdump> open ./dirdat/rt000001 logdump> detail data ``` 2. **进程启动顺序** - 首次启动时需使用 `START REPLICAT <进程名>` 激活进程 - 修改参数文件后需重启进程:`STOP REPLICAT <进程名>` → `START REPLICAT <进程名>` 3. **与初始加载配合** 若需确保数据一致性(如初始加载后增量同步): - 初始加载时使用 `flashback_scn`(如引用[2]所示) - 配置 Replicat 的 `STARTSCN` 与加载 SCN 一致[^3] 4. **高可用场景** 若主库故障转移(如引用[1]所述): - 在新节点启动 Replicat 前需重新指定 SCN - 需确保新节点能访问相同 Trail 文件 #### 🌰 典型应用场景 - **数据迁移**:从指定 SCN 开始复制,确保迁移点一致性 - **故障恢复**:跳过已处理事务,从故障点 SCN 恢复 - **数据审计**:从特定时间点 SCN 重放事务 > ⚠️ **重要提示**:SCN 指定需精确匹配数据库状态,错误 SCN 可能导致数据丢失或重复。建议先在测试环境验证。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值