Flink CDC2.4版本读取的第一条 为什么是read呢,before数据是空?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC 2.4版本读取数据时,如果发现第一条记录的read字段有值,而before字段为空,这通常与CDC的工作机制以及数据库表的配置有关。以下是详细的原因分析和解决方案:
首次启动时的全量读取阶段
initial模式下(默认启动模式),作业会先进行全量数据扫描,然后切换到增量读取阶段。INSERT事件发送到下游,因此before字段为空,而read字段包含当前行的数据。Postgres表的REPLICA IDENTITY设置
REPLICA IDENTITY未设置为FULL,则在捕获UPDATE或DELETE事件时,before字段可能为空。before字段缺失完整信息。MySQL Binlog格式的影响
ROW模式,并且表没有主键或唯一键,Flink CDC可能无法正确解析before字段。UPDATE操作在Flink SQL中会被拆分为update_before和update_after两条记录。如果before字段为空,可能是由于Binlog中未记录完整的旧值。CDC连接器的增量快照算法
INSERT事件,因此before字段为空。检查数据库表的配置
对于Postgres:
REPLICA IDENTITY设置为FULL,以记录完整的旧值信息。ALTER TABLE yourTableName REPLICA IDENTITY FULL;
'debezium.slot.drop.on.stop' = 'true'
对于MySQL:
ROW模式,并确保binlog_row_image设置为FULL,以记录完整的旧值和新值。调整Flink CDC的启动模式
scan.startup.mode设置为latest-offset,直接从增量阶段开始读取。
'scan.startup.mode' = 'latest-offset'
INSERT事件。优化Flink作业配置
'scan.incremental.snapshot.chunk.size' = '5000'  -- 减少每个分片的数据条数
验证数据源权限
SELECT、REPLICATION SLAVE和REPLICATION CLIENT等权限。initial模式下,Flink CDC会将全量数据作为INSERT事件发送,因此before字段始终为空。这是正常行为,无需额外处理。REPLICA IDENTITY设置,否则可能导致before字段缺失。通过以上分析和调整,您可以解决Flink CDC 2.4版本读取数据时before字段为空的问题。如果问题仍未解决,请提供更多上下文信息以便进一步排查。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。