Oracle CDC 数据不一致排查:长事务与 LogMiner 上下文丢失问题
ORACLE 数据同步,数据不一致问题多种多样,其中在长事务场景里尤其容易出现。
一个事务可能跨越多轮 LogMiner 解析窗口;一条长 SQL 可能被拆成多段;一次 BLOB 更新可能先记录 locator,再分多次写入;事务最后还可能回滚。只要事务前半段的关键上下文丢了,目标端就可能无法还原源端真正提交后的结果。
本文围绕 Oracle LogMiner 增量同步中的长事务问题,重点讨论 3 个方面:
- 长事务为什么会影响 Oracle 同步准确性。
- BLOB、CSF 长 SQL、rollback 场景里,问题通常是怎么出现的。
- 如果要处理这类问题,同步链路通常需要具备哪些能力。
Oracle 长事务为什么会影响同步准确性
Oracle LogMiner 做增量同步时,通常会按 SCN 区间持续解析 redo 日志。对短事务来说,这种方式一般比较稳定。因为事务开始、数据变更和提交大多落在相近窗口内,同步链路比较容易还原完整结果。
长事务不一样。
它可能在较早的 SCN 开始,中间经历多次 DML,跨过多轮解析窗口,最后才提交或回滚。如果同步任务每轮都只从上次结束的位置继续向前读,当前窗口里看到的可能只是事务后半段,前面的定位信息、SQL 片段或前置变更已经不在当前解析范围里。
这里还有一个容易被忽略的点:START_LOGMNR 的起点会直接影响 V$LOGMNR_CONTENTS 产出的逻辑事件。这个起点并不等同于一次 SCN >= startScn 的结果过滤。起点如果刚好落在长事务、BLOB 更新链路或长 SQL 片段的中间位置,LogMiner 可能因为缺少前置上下文,无法还原原本可识别的 DML 事件。
所以现场看到的,往往会是更隐蔽的问题:
- BLOB 更新被拆成 locator 和写入片段后,如果缺少前置上下文,后续
LOB_WRITE可能无法被正确识别或归属。 - 长 SQL 被拆成多段记录后,如果缺少前置片段,LogMiner 可能无法把它还原为可解析的 DML。
- rollback 依赖的前置 DML 不在当前解析窗口内时,回滚记录可能无法被正确识别和作用。
- 大事务跨窗口后,目标端可能残留源端最终并未生效的数据。
因此,长事务问题的核心在于事务上下文不完整,单纯关注某一条日志是否读取成功,通常很难定位根因。
Oracle 数据同步不一致的典型现象
如果你的 Oracle 同步链路存在长事务上下文处理不足,通常会在以下几类现象中暴露出来。
- 目标端多出数据:源端事务最终回滚,但目标端已经写入了变更。
- 目标端字段值不完整:部分大字段、长文本或复杂更新未能完整还原。
- BLOB 文件损坏或内容不一致:附件、图片、票据影像等字段在目标端无法打开,或内容与源端不同。
- 偶发性更强:同一张 表大部分时间正常,只有在批处理、补数据、大对象写入或业务高峰时出现问题。
- 任务表面正常:同步任务没有明显失败,但数据校验能发现差异。
这些现象的共同点是:目标端没有拿到源端事务提交后的最终结果,而是落入了某个中间状态、残缺状态,或者本应被回滚的状态。
BLOB 同步场景:locator 和 LOB_WRITE 上下文丢失

如果库里有附件、图片、票据、影像这类字段,BLOB 往往是最先暴露问题的地方。
原因不复杂。Oracle 对 BLOB 的 redo 表达方式,和普通字段更新不一样。一次 BLOB 更新,通常不会表现为一条完整的 UPDATE ... SET blob_col = ...。它往往会先出现定位目标行和目标列的 locator 事件,然后再出现多次 LOB_WRITE 写入事件。
如果 LogMiner 的解析窗口刚好切在这条链路中间,前面的 locator 不在当前上下文里,后面的 LOB_WRITE 就可能无法被正确识别,或者无法被正确归属到目标表、目标列和目标行。
最后看到的现象,通常不是“任务失败”,而是目标端文件不完整,或者大字段内容直接错误。
对同步链路来说,BLOB 的难点远不止“大对象传 输”。它强依赖事务上下文、行列定位信息、片段顺序和提交回滚状态。只要其中一段上下文断掉,最终结果就可能偏离源端。
CSF 长 SQL 场景:SQL_REDO 分片还原失败

再看长 SQL。
当 SQL_REDO 内容过长时,LogMiner 可能会通过 CSF 等方式把一条完整 SQL 拆成多段记录。只有片段收全了,链路才能正确还原出完整 DML。
如果这条 SQL 又落在长事务里,而 START_LOGMNR 起点刚好切在中间片段附近,影响会进一步扩大。缺少前置上下文时,LogMiner 可能无法把这些 redo 还原成原本可识别的业务 DML,最终产出 Unsupported 这类无法用于字段解析的记录。
在字段很多、字段值很长、更新语句体积也大的表上,这类问题会更明显。例如大宽表、包含长文本字段的业务表、一次更新大量列的补偿任务,都更容易触发长 SQL 拆分和跨窗口解析问题。
对于同步工具而言,处理 CSF 长 SQL 不能只看当前行日志,还需要判断片段是否完整、是否属于同一条 SQL、是否属于同一事务,以及是否已经具备足够上下文进行结构化解析。
