用flinkcdc2.4版本获取oracle数据,用datastream方式没问题,是什么原因啊?

用flinkcdc2.4版本获取oracle数据,用datastream方式没问题,用flinksql方式,报ora44609,CONTINOUS_MINE 已经不支持用于 DBMS_LOGMNR.START_LOGMNR 这个错误,是什么原因啊?oracle是19c版本

展开
收起
真的很搞笑 2023-10-31 17:27:31 54 发布于黑龙江 分享
分享
版权
举报
阿里云 AI 助理回答

根据您描述的问题,使用Flink CDC 2.4版本通过Flink SQL方式获取Oracle 19c数据时,报错ORA-44609: CONTINUOUS_MINE 已经不支持用于 DBMS_LOGMNR.START_LOGMNR。以下是问题的原因分析及解决方案:


问题原因

  1. Oracle 19c的LogMiner限制
    Oracle 19c中已经废弃了CONTINUOUS_MINE选项,该选项在早期版本中用于实时挖掘日志。从Oracle 19c开始,DBMS_LOGMNR.START_LOGMNR不再支持CONTINUOUS_MINE参数。
    Flink CDC 2.4版本依赖于Debezium,而Debezium底层使用Oracle LogMiner进行日志解析。如果Debezium配置中未正确适配Oracle 19c的特性,则会导致上述错误。

  2. Flink SQL与DataStream API的差异
    在Flink CDC中,DataStream API和Flink SQL API的实现方式略有不同。DataStream API可能直接使用了更底层的配置,而Flink SQL API则依赖于Debezium的默认配置。如果Debezium未正确处理Oracle 19c的废弃特性,则可能导致SQL方式报错。


解决方案

1. 检查并升级Debezium版本

  • 确保使用的Debezium版本支持Oracle 19c。Debezium 1.7及以上版本对Oracle 19c有更好的兼容性。
  • 如果当前使用的Debezium版本较低,建议升级到最新稳定版本(如Debezium 1.9或更高)。
  • 升级方法:
    1. 下载对应版本的Debezium Connector JAR包。
    2. 替换Flink lib目录下的旧版JAR文件。
    3. 重启Flink集群以应用更改。

2. 修改Debezium配置

  • 在Flink SQL中,可以通过设置Debezium的参数来避免使用CONTINUOUS_MINE。具体配置如下:
    CREATE TABLE oracle_source (
        ...
    ) WITH (
        'connector' = 'oracle-cdc',
        'hostname' = '<your_oracle_host>',
        'port' = '<your_oracle_port>',
        'username' = '<your_username>',
        'password' = '<your_password>',
        'database-name' = '<your_database>',
        'schema-name' = '<your_schema>',
        'table-name' = '<your_table>',
        'debezium.log.mining.strategy' = 'online_catalog',
        'debezium.database.history' = 'io.debezium.relational.history.MemoryDatabaseHistory'
    );
    
  • 关键参数说明
    • debezium.log.mining.strategy:设置为online_catalog,避免使用CONTINUOUS_MINE
    • debezium.database.history:使用内存数据库历史记录,减少对LogMiner的依赖。

3. 验证Oracle权限

  • 确保Oracle用户具有以下权限:
    GRANT SELECT ANY TRANSACTION TO <your_user>;
    GRANT LOGMINING TO <your_user>;
    GRANT SELECT ON V$LOGMNR_CONTENTS TO <your_user>;
    GRANT SELECT ON V$ARCHIVED_LOG TO <your_user>;
    GRANT SELECT ON V$LOGMNR_LOGS TO <your_user>;
    
  • 如果使用PDB(可插拔数据库),还需配置debezium.database.pdb.name参数,指定PDB名称。

4. 使用DataStream API作为临时替代方案

  • 如果上述方法仍无法解决问题,可以暂时切换到DataStream API,因为DataStream API可能未受到CONTINUOUS_MINE限制的影响。
  • 示例代码:

    Properties properties = new Properties();
    properties.setProperty("debezium.log.mining.strategy", "online_catalog");
    properties.setProperty("debezium.database.history", "io.debezium.relational.history.MemoryDatabaseHistory");
    
    MySqlSource<String> source = MySqlSource.<String>builder()
        .hostname("<your_oracle_host>")
        .port(<your_oracle_port>)
        .databaseList("<your_database>")
        .tableList("<your_schema>.<your_table>")
        .username("<your_username>")
        .password("<your_password>")
        .deserializer(new JsonDebeziumDeserializationSchema())
        .debeziumProperties(properties)
        .build();
    
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.addSource(source).print();
    env.execute("Oracle CDC Example");
    

重要提醒

  • Oracle 19c的兼容性:确保所有组件(Flink、Debezium、Oracle JDBC驱动)均支持Oracle 19c。
  • 性能影响:使用online_catalog策略可能会增加对Oracle系统表的查询压力,请评估生产环境的性能影响。
  • 升级风险:升级Debezium或Flink版本前,请在测试环境中验证兼容性。

通过以上步骤,您可以解决ORA-44609错误,并成功使用Flink SQL方式获取Oracle 19c的数据。如果问题仍未解决,请提供更多上下文信息以便进一步排查。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

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

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

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