实战踩坑记录)
标签Flink、Debezium、CDC、实时同步、大数据 专栏Flink 实战一、前言最近做实时数仓需要把 MySQL 的数据变更实时同步到 Flink 做流处理选用Flink CDC Debezium方案。部署过程踩了几个坑包括版本依赖冲突、连接超时、binlog 没开启等问题整理完整可复现的步骤方便大家直接参考。环境版本说明版本不匹配是 90% 报错根源Flink1.17.2MySQL8.0Flink CDC connector2.4.0JDK1.8操作系统CentOS7二、前置准备1. MySQL 开启 binlog修改my.cnf配置[mysqld] server-id1 log-binmysql-bin binlog_formatROW expire_logs_days7修改完成重启 MySQL。验证命令show variables like log_bin; show variables like binlog_format;输出 ON 和 ROW 才算成功。2. 创建 CDC 专用账号授予权限CREATE USER flink_cdc% IDENTIFIED BY 123456; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO flink_cdc%; FLUSH PRIVILEGES;三、Flink SQL 建表语句将 MySQL 订单表映射为 Flink CDC 表捕获增删改CREATE TABLE mysql_order_cdc ( id INT, order_no STRING, amount DECIMAL(10,2), create_time TIMESTAMP(3), PRIMARY KEY (id) NOT ENFORCED ) WITH ( connector mysql-cdc, hostname 127.0.0.1, port 3306, username flink_cdc, password 123456, database-name test_db, table-name t_order, server-time-zone Asia/Shanghai );测试查询SELECT * FROM mysql_order_cdc;启动任务后在 MySQL 中修改 t_order 表的数据Flink 控制台会实时捕获变更数据。四、踩坑记录 解决方案重点坑 1Timezone 时区异常The server time zone value XXX is unrecognized原因没有指定时区参数 ✅解决增加server-time-zone Asia/Shanghai坑 2Cannot read binlog, Missing REPLICATION SLAVE privilege原因数据库账号缺少复制权限 ✅解决执行上面的 GRANT 授权语句刷新权限坑 3依赖包冲突NoClassDefFoundError原因Flink CDC 的 jar 包版本和 Flink 版本不匹配 ✅解决下载flink-connector-mysql-cdc-2.4.0.jar放到flink/lib目录注意 Flink1.17 只能用 2.4.x 系列 cdc不能用更高版本。坑 4读取全量快照时任务 OOM✅解决调大 TaskManager 内存增加scan.snapshot.fetch.size 1024分批拉取快照数据五、补充说明binlog 模式必须是 ROWSTATEMENT 模式无法捕获行级变更表必须有主键CDC 连接器依赖主键做快照合并生产环境不要直接使用 root 账号做 CDC 同步遵循最小权限原则。六、总结Flink CDC 可以很方便实现 MySQL 的实时数据捕获不用单独部署 Debezium 服务。版本对齐、binlog 开启、账号权限、时区这四点是最容易踩坑的地方。 测试阶段先小表验证确认全量读取 增量捕获正常后再迁移到生产环境。CSDN 发布设置建议 分类专栏Flink 实战 标签FlinkDebeziumCDC实时计算大数据原创 ✅