众所周知,Flink CDC是一个流数据集成工具,支持多种数据源的实时数据同步,包括大家所熟知的MySQL,MongoDB等。原本是作为Flink的子项目运行,后来捐献给Apache基金会,底层实现比较依赖于Flink生态。具体到数据同步底层实现则相对比较依赖于Debezium。
对于Oracle实时数据同步有需求的用户来说,经常会有疑问,比如Flink CDC支持Oracle实时数据同步吗,可以应用到生产环境吗?这些问题也经常且反复的在Flink CDC社区群被来自各个不同行业的用户所咨询。
本文将以实际的实践经验解答这些问题,“避免入坑”。但同时也提供Oracle端的完整配置供读者朋友们测试使用,欢迎留言区探讨~
- Flink CDC支持Oracle实时数据同步吗?
支持,但有限。
Flink CDC在Oracle实时数据同步的实现上依赖于Debezium,目前依赖的版本是1.9.8.Final(比较老的版本,现在Debezium最新版本已经3.x了)。Debezium底层对Oracle的支持有2种模式,Logminer(默认模式)和Xstream。Flink CDC官方对Oracle的默认支持模式也是Logminer,也是用的比较多的一种。
Logminer是Oracle推出的一个开源工具,原本初衷是帮助DBA来排查数据库问题的,现在很多非Oracle官方推出的基于日志解析的Oracle CDC实时同步工具基本都是基于Logminer做的封装,存在各种问题。比如同步效率很低,尤其是当存量数据非常大的时候,开启initial模式(全量/存量+增量),仅同步存量数据都会消耗很多时间,甚至有时候会出现snapshot too old错误导致同步任务挂掉,只能重新同步。并且目前只支持Oracle主库同步。
- 可以在生产环境中应用Flink CDC来完成Oracle的实时数据同步吗?
强烈不建议、强烈不建议、强烈不建议,重要的事情说三遍!!!
Oracle作为一个闭源工具,官方推出了一个商业化产品来完成对Oracle实时数据同步的支持,叫Oracle Golden Gate,简称OGG。这是对Oracle实时数据同步实现首推工具,同步效率、稳定性、健壮性都远远高于各种基于Logminer做二次封装的工具。即使是Flink CDC社区维护人员,在Oracle实时数据同步的工具上,也是首推OGG,不建议使用Flink CDC更不建议上生产。有兴趣的读者可以在Flink CDC社区钉钉群搜索关键字Oracle查看社区用户的讨论。
可能到了这里,仍然有一部分用户想说,我就是想用Flink CDC来解决Oracle实时数据同步的问题,毕竟是免费的,OGG那么贵,用不起。
那么接下来作为在Flink CDC Oracle踩过坑的用户之一,分享下Flink CDC对Oracle RAC架构CDB+PDB模式的实时数据同步之Oracle端怎么配置。(PS: Flink CDC官方在Oracle Connector CDC文档的配置中存在诸多问题,且对于Oracle 19c,CDB + PDB不支持Incremental Snapshot模式)
1. 依赖的版本和部署模式:
- Flink 1.18
- Flink CDC 3.2.1/2.4.2(PS: Flink CDC
3.X版本及之后对Oracle的支持几乎没有迭代更新) - Debezium 1.9.8.Final
- Oracle 19c, RAC/单机,CDB + PDB模式
2. 创建Oracle用户和赋权
1. 创建一个COMMON用户
CREATE USER "PPC#FLINKCDCAPP"
IDENTIFIED BY "******"
DEFAULT TABLESPACE ZHGC
TEMPORARY TABLESPACE TEMP_ZHGC
CONTAINER=ALL;
2. 用户PPC#FLINKCDCAPP赋权
GRANT CREATE SESSION TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SET CONTAINER TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT FLASHBACK ANY TABLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ANY TABLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT_CATALOG_ROLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT EXECUTE_CATALOG_ROLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ANY TRANSACTION TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT LOGMINING TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT ANALYZE ANY TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT CREATE TABLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT LOCK ANY TABLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT ALTER ANY TABLE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT CREATE SEQUENCE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT EXECUTE ON DBMS_LOGMNR_D TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$DATABASE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOG TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOG_HISTORY TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOGMNR_LOGS TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOGMNR_CONTENTS TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOGMNR_PARAMETERS TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$LOGFILE TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$ARCHIVED_LOG TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON V_$TRANSACTION TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON GV_$TRANSACTION TO PPC#FLINKCDCAPP CONTAINER=ALL;
GRANT SELECT ON SYS.LOGMINER_DICT_CACHE TO PPC#FLINKCDCAPP CONTAINER=ALL;
阅读原文获取更多信息
https://mp.weixin.qq.com/s/GSbsBLS8aOXWqNsq6hny7g