pyflink oracle cdc null

flink oracle数据同步 pyflink oracle cdc null :

pyflink1.18 做oracle数据库数据同步,flink-oracle-cdc 读取出数据全部为null。

oracle数据库实时同步到数仓或数据湖。


pyflink tableapi 连接到oracle数据库,打印同步结果

flink建表及打印结果:

def oracle_cdc_2_doris(env):
    """
    Flink CDC 实时同步 Oracle 数据
    ORALE -- FLINK 大小写敏感 表名及表头 都要用大写
    -- 将要同步的表 开启全日志设置
    ALTER TABLE FLINK.ORACLE_SOURCE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS
    """
    source_oracle = """
            CREATE TABLE cdc_oracle_source (
                id int,
                name STRING
            ) WITH (
                'connector' = 'oracle-cdc',
                'hostname' = '*.*.*.*',
                'port' = '1521',
                'username' = 'flink',
                'password' = 'flink',
                'database-name' = 'SID',
		        'schema-name' = 'SCHEMA',
		        'table-name' = 'ORACLE_SOURCE',
		        'debezium.database.tablename.case.insensitive' = 'false',
		        'debezium.log.mining.strategy' = 'online_catalog',
                'debezium.log.mining.continuous.mine' = 'true'
            );
        """
    sink_print = """create table if not exists sink_print (
    id int,
    name STRING
    )
    with 
    (
         'connector' = 'print'
    )
    """
    print_sql = "insert into sink_print select * from cdc_oracle_source;"
    select_sql = "select * from cdc_oracle_source;"

    env.execute_sql(source_oracle) # 创建连接mysql表
    env.execute_sql(sink_print) # 创建print表

    statement_set = env.create_statement_set() # 创建一个可接受 DML 语句或表的 Statementset 实例。 它可用于执行包含多个 sink 的作业
    statement_set.add_insert_sql(print_sql) # sql插入语句

    statement_set.execute().wait() # 执行 statement set

if __name__ == '__main__':
    t_env = TableEnvironment.create(EnvironmentSettings.in_streaming_mode())
    t_env.get_config().get_configuration().set_string("execution.checkpointing.interval", "3s")
    path = '/flink/jar_dir'
    filters = ['flink-connector-jdbc-3.1.2-1.18.jar', 'flink-doris-connector-1.18-1.6.0.jar', 'ojdbc6-11.2.0.4.jar', 'flink-sql-connector-oracle-cdc-2.2.1.jar']
    str_jars = get_jar_file(dir_path=path, need_jars=filters)
    t_env.get_config().set("pipeline.jars", str_jars)
    oracle_cdc_2_doris(env=t_env)
# 执行结果如下图

同步数据全为null


原因分析:

Debezium 的开发者将 “大小写不敏感” 统一定义为了 “需要将表名转换为小写”。对于 Debezium 支持的 PostgreSQL、Mysql 等确实如此。然而对于 Oracle 数据库,“大小写不敏感” 却意味着在内部元信息存储时,需要将表名转换为大写。

例如:oracle数据库表名、字段名都默认大写ORACLE_SOURCE(ID, NAME) 。而flink中Debezium table 则默认都为小写 oracle_source(id, name)。造成两边不匹配,flink 读不到oracle数据,所以为null。


解决方案:

将flink建表增加参数 ‘debezium.database.tablename.case.insensitive’=‘false’
并且 表、字段统一显示的写为大写字母。

例如:CREATE TABLE cdc_oracle_source (
ID int,
NAME STRING
)

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值