Flink CDC里Oracle cdc 有没有碰到这样的错误?

Flink CDC里Oracle cdc 有没有碰到这样的错误
io.debezium.DebeziumException: Online REDO LOG files or archive log files do not contain the offset scn 22210454818. Please perform a new snapshot

让oracle dba查了这个scn的日志生成时间, 是去年11月份的, 可是我这个同步任务上个月才开始运行,怎么回事?会不会是checkpoint异常?

展开
收起
小小鹿鹿鹿 2024-04-08 20:27:20 103 分享 版权
阿里云 AI 助理回答

问题分析

您在使用Flink CDC进行Oracle数据同步时,遇到了以下错误:

io.debezium.DebeziumException: Online REDO LOG files or archive log files do not contain the offset scn 22210454818. Please perform a new snapshot

根据错误信息,Debezium无法找到指定的SCN(System Change Number)对应的日志文件。您提到该SCN的日志生成时间是去年11月份,而您的同步任务上个月才开始运行。这种情况可能与以下几个因素有关:

  1. Oracle日志保留策略:Oracle的在线REDO日志或归档日志可能已经被清理,导致无法找到指定的SCN。
  2. Checkpoint异常:Flink作业的Checkpoint可能记录了一个过期的SCN,导致任务重启时尝试从一个不存在的SCN位置恢复。
  3. 初始快照未正确完成:如果任务启动时未正确完成初始快照,可能会导致Debezium尝试从一个无效的SCN位置读取日志。

解决方案

1. 检查Oracle日志保留策略

Oracle的在线REDO日志和归档日志有固定的保留时间,超过保留时间的日志会被清理。您可以通过以下SQL命令检查当前的日志保留策略:

-- 查询当前的归档日志保留时间
SELECT * FROM v$parameter WHERE name = 'log_archive_dest_1';

-- 查询当前的SCN
SELECT CURRENT_SCN FROM V$DATABASE;

如果日志保留时间较短(例如仅保留几天),而您的任务需要从较早的SCN开始读取,则需要调整日志保留策略。建议将归档日志保留时间延长至覆盖任务的整个运行周期。


2. 确认Flink Checkpoint状态

Flink作业的Checkpoint会记录Debezium的偏移量(Offset SCN)。如果Checkpoint记录的SCN已经过期,任务重启时会尝试从一个无效的SCN位置恢复。您可以通过以下步骤确认Checkpoint状态:

  • 检查Checkpoint配置:确保Checkpoint间隔合理,并且启用了增量Checkpoint以减少状态大小。
  • 清理过期Checkpoint:如果Checkpoint中记录的SCN已经过期,可以删除旧的Checkpoint并重新启动任务。
# 删除Flink的Checkpoint目录
rm -rf /path/to/flink/checkpoints/*

3. 执行新的快照

如果上述方法无法解决问题,建议执行一个新的快照(Snapshot)。快照会从当前数据库的状态开始同步,而不是依赖于历史日志。您可以通过以下方式触发新的快照:

  • 修改Debezium配置:将debezium.snapshot.mode设置为initial,以强制执行初始快照。
debezium.snapshot.mode=initial
  • 手动清理Debezium的偏移量存储:如果使用Kafka作为偏移量存储,可以删除相关的Kafka主题(例如__debezium-offsets),以清除旧的偏移量记录。
# 删除Kafka中的偏移量主题
kafka-topics.sh --delete --topic __debezium-offsets --bootstrap-server localhost:9092

4. 确保任务启动时的SCN有效

为了避免类似问题再次发生,建议在任务启动时明确指定一个有效的SCN。您可以通过以下SQL命令获取当前的SCN,并将其配置到Debezium的启动参数中:

-- 获取当前SCN
SELECT CURRENT_SCN FROM V$DATABASE;

然后,在Debezium配置中指定snapshot.scn参数:

debezium.snapshot.scn=<current_scn>

可能的原因总结

  1. 日志清理:Oracle的在线REDO日志或归档日志可能已被清理,导致无法找到指定的SCN。
  2. Checkpoint异常:Flink作业的Checkpoint可能记录了一个过期的SCN。
  3. 初始快照未完成:任务启动时未正确完成初始快照,导致Debezium尝试从无效的SCN位置读取日志。

建议操作步骤

  1. 检查日志保留策略,确保归档日志保留时间足够长。
  2. 清理过期Checkpoint,避免任务从无效的SCN恢复。
  3. 执行新的快照,通过debezium.snapshot.mode=initial或清理偏移量存储来触发。
  4. 明确指定有效的SCN,在任务启动时配置debezium.snapshot.scn参数。

重要提醒

  • 日志保留时间:确保Oracle的归档日志保留时间覆盖任务的整个运行周期,否则可能导致日志丢失。
  • Checkpoint管理:定期清理过期的Checkpoint,避免任务从无效的SCN恢复。
  • 快照模式:在任务启动时,建议使用initial模式执行初始快照,以确保数据一致性。

通过以上步骤,您可以有效解决当前问题并避免类似问题再次发生。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

还有其他疑问?
咨询AI助理