有没有大佬在使用flinkcdc同步oracle数据的时候遇到过类似的问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用 Flink CDC 同步 Oracle 数据时,可能会遇到一些常见问题。以下是基于知识库资料的详细解答和解决方案:
问题原因:
这是由于 Oracle CDC 2.4 的一个已知 bug,底层原因是 UPDATE LOG_MINING_FLUSH SET LAST_SCN =
操作失败,导致表 LOG_MINING_FLUSH
不存在。
解决方案:
需要手动在 CDB 实例中重建 LOG_MINING_FLUSH
表。具体操作如下:
-- 切换到CDB实例
ALTER SESSION SET CONTAINER = CDB$ROOT;
-- 建表并写入数据
CREATE TABLE LOG_MINING_FLUSH(LAST_SCN NUMBER(19,0));
INSERT INTO LOG_MINING_FLUSH VALUES (0);
问题原因:
Oracle LogMiner 对表名和列名的长度有限制,表名或列名超过30个字符时会导致无法捕获数据。
解决方案:
确保需要采集的表名和列名长度均不超过30个字符。如果表名过长,建议重命名表或调整同步逻辑。
问题原因:
Flink 中字段的名字大小写与 Oracle 表中的字段不一致,导致无法匹配列名。
解决方案:
确保 Flink 中字段的名字大小写与 Oracle 表完全一致。例如,如果 Oracle 表中字段名为 file
,则 Flink 中也需要定义为 file
。
问题原因:
Oracle CDC 的架构问题可能导致读取效率较低,尤其是在大数据量场景下。主要原因是: - 需要加载和分析大量的 archiveLog
和 onlineLog
文件。 - 调用 DBMS_LOGMNR.START_LOGMNR
分析日志文件的过程较慢。 - 从 V$LOGMNR_CONTENTS
中读取分析后的数据也较慢。
优化建议:
- 使用 Dataphin 实时集成工具,其在部分大数据量场景下性能表现更优。 - 减少不必要的日志分析范围,优化 startScn
和 endScn
的设置。 - 确保数据库有足够的资源支持在线字典的加载。
问题原因:
Oracle CDC 的权限配置较为复杂,尤其是 CDB 模式和非 CDB 模式的权限要求不同。
排查方法:
1. 查询当前账户:
SELECT USER FROM DUAL;
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'C##DBZUSER';
SELECT TABLE_NAME FROM DBA_TAB_PRIVS WHERE GRANTEE = 'C##DBZUSER';
解决方案:
根据实际环境(CDB 或非 CDB 模式),按照文档正确配置权限。
问题原因:
可能是由于并发数设置过高或连接池 Size 设置过大,占用了大量连接数。
解决方案:
- 降低作业并发数。 - 减小连接池 Size。 - 优化 SQL 逻辑,尝试使用 CDAS(Change Data Capture as a Service)来复用连接。
问题原因:
如果业务上没有区分新增、修改数据的字段,Oracle Reader 无法进行增量数据同步。
解决方案:
- 在数据库中添加时间戳字段(如 modify_time
),并在同步时通过 WHERE
条件指定时间范围。 - 对于自增 ID 类型的数据,可以通过 WHERE
条件指定上一阶段的最大 ID。
以下是一个通过 Flink CDC 同步 Oracle 数据的完整示例:
<FLINK_HOME>/bin/flink run \
-Dexecution.checkpointing.interval=10s \
-Dparallelism.default=1 \
-c org.apache.doris.flink.tools.cdc.CdcTools \
lib/flink-doris-connector-1.16-1.5.2.jar \
oracle-sync-database \
-database test_db \
-oracle-conf hostname=127.0.0.1 \
-oracle-conf port=1521 \
-oracle-conf username=admin \
-oracle-conf password="password" \
-oracle-conf database-name=XE \
-oracle-conf schema-name=ADMIN \
-including-tables "tbl1|test.*" \
-sink-conf fenodes=selectdb-cn-****.selectdbfe.rds.aliyuncs.com:8080 \
-sink-conf username=admin \
-sink-conf password=****
希望以上内容能够帮助您解决 Flink CDC 同步 Oracle 数据时遇到的问题!
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。