简述
Logminer 用于分析 Oracle 的日志,可以用于数据恢复。
许多同步工具软件例如:Debezium、CloudCanal 使用 Logminer 进行增量数据同步,稳定性很不错。
下面是在生产环境使用 Logminer 实现 Oracle 数据同步过程中的一些 丢数据场景,希望带给读者一些收获。
- 增量事件 SCN 乱序问题
- MISSING_SCN 事件干扰
- 新增的归档日志消费模式
坑点
增量事件 SCN 乱序问题
Oracle 源端 Logminer 数据同步原理大致如下:
- 获取所有包含当前 SCN 位点的 Redo 或 Archive 日志文件,并添加到 Logminer 中
- 计算本次需要分析的 SCN 范围(START_SCN, END_SCN)
- Logminer 对于 SCN 范围进行日志分析,分析结果展现在 V$LOGMNR_CONTENTS 视图中
- 扫描 V$LOGMNR_CONTENTS 视图,转换处理后同步到目标端
通过扫描 V$LOGMNR_CONTENTS 视图时指定了 SCN 范围进行查询,但在实际场景中偶发 SCN 乱序问题。
同时 Oracle 官方也建议查询视图时不要进行过多的范围过滤或排序处理,以避免查询结果乱序。
可以通过下面的方式解决该问题:
- 扫描 V$LOGMNR_CONTENTS 视图时直接查询所有记录,其 SCN 范围完全依赖于 Logminer 所指定的文件
- 设定 Logminer 分析的步长控制分析性能
MISSING_SCN 事件干扰
使用 Logminer 分析 Redo 日志时,有时会出现 MISSING_SCN 事件,如何忽略该事件会导致丢数据。
MISSING_SCN 事件具体意义为
- Logminer 分析 Redo 日志时,由于日志切换或其他特殊情况,导致部分 SCN 事件没有被 Logminer 分析到,因此在 V$LOGMNR_CONTENTS 视图中体现为
MISSING_SCN。
因此需要遇到 MISSING_SCN 事件时采取一定的策略规避漏扫问题,具体动作为:
- 停止扫描,回退当前 SCN
- 根据当前 SCN 重新分析和消费日志文件
重新分析后,缺失的 SCN 记录会被 Logminer 分析到,并且此类型事件出现频率较小,因此对同步效率影响非常小。
归档日志消费模式
Logminer 分析 Redo 日志时,如果 END_SCN 与最新 SCN 接近,可能会导致部分 SCN 无法被 Logminer 分析,从而出现数据丢失。
这种情况难以避免,因为很难在 Logminer 层面确定是否有 SCN 被漏掉。
一般可以通过设置分析的 END_SCN 最新的 SCN 保持一定距离,这种做法虽牺牲了一部分实时性,但换取了数据的准确性,而该方式和 只消费归档日志 有一定的相似性。
归档日志不会再发生变化,从而能够保证 Logminer 分析的准确性,对于不太注重实时性的业务(比如日报),这是一个可接受的方式(增量同步的好处不光只是实时性)。
只消费归档日志 务会根据 Archive 日志文件 + SCN 双位点 的方式,以 Archive 生成的时间顺序逐个消费,这样可以保证不漏扫任何一个 Archive 文件。
总结
本篇文章主要介绍使用 Logminer 实现 Oracle 数据同步过程中的一些 丢数据场景,如果解决了上面几个问题,同步准确性会大大提升。