标签:Flink、Debezium、CDC、实时同步、大数据 专栏:Flink 实战
一、前言
最近做实时数仓,需要把 MySQL 的数据变更实时同步到 Flink 做流处理,选用Flink CDC + Debezium方案。部署过程踩了几个坑,包括版本依赖冲突、连接超时、binlog 没开启等问题,整理完整可复现的步骤,方便大家直接参考。
环境版本说明(版本不匹配是 90% 报错根源!)
- Flink:1.17.2
- MySQL:8.0
- Flink CDC connector:2.4.0
- JDK:1.8
- 操作系统:CentOS7
二、前置准备
1. MySQL 开启 binlog
修改my.cnf配置
[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
expire_logs_days=7
修改完成重启 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 控制台会实时捕获变更数据。
四、踩坑记录 & 解决方案(重点)
坑 1:Timezone 时区异常 The server time zone value 'XXX' is unrecognized
原因:没有指定时区参数 ✅解决:增加'server-time-zone' = 'Asia/Shanghai'
坑 2:Cannot 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
✅解决:
五、补充说明
六、总结
Flink CDC 可以很方便实现 MySQL 的实时数据捕获,不用单独部署 Debezium 服务。版本对齐、binlog 开启、账号权限、时区这四点是最容易踩坑的地方。 测试阶段先小表验证,确认全量读取 + 增量捕获正常后,再迁移到生产环境。
CSDN 发布设置建议 分类专栏:Flink 实战 标签:Flink Debezium CDC 实时计算 大数据 原创 ✅

