开启从库binlog是flink cdc实时捕获的前提,需配置log_bin=on、binlog_format=row、唯一server_id及server_uuid;停用sql线程、专用账号授权、规避read_only限制、正确处理tinyint(1)映射并优选avro序列化。

从库开启 binlog 是前提,否则 Flink/CDC 无法捕获变更
MySQL 默认从库不写 binlog,但 Flink CDC、Debezium 等工具依赖从库的 binlog 进行增量解析。不开启就只能全量拉取,根本谈不上“实时”。
- 必须在从库
my.cnf中显式配置:log_bin = ON、binlog_format = ROW、server_id独一无二 - 重启 MySQL 后执行
SHOW VARIABLES LIKE 'log_bin';确认返回ON,再查SHOW BINLOG EVENTS LIMIT 1;看是否可读 - 常见坑:只改了主库配置;或开了
log_bin却没设binlog_format = ROW——STATEMENT或MIXED下 CDC 解析会丢字段或失败
Flink CDC 连接从库时,要绕过复制线程冲突
从库上已有 SQL 线程在回放主库 binlog,Flink CDC 再起一个 client 去 dump binlog,容易触发 ER_SLAVE_HAS_RUNNING_SQL_THREAD 或连接被 kill。
- 确保从库已执行
STOP SLAVE;(仅限分析场景,不影响业务主从同步)—— CDC 工具自己管理位点,不需要原生复制线程 - 连接参数里必须加
server-time-zone=UTC和connectTimeout=30000,否则时区错乱或网络抖动导致任务频繁 failover - 别用 root 用户直连:创建专用账号并授权
SELECT、RELOAD、SHOW DATABASES、REPLICATION SLAVE、REPLICATION CLIENT
从库只读模式下,Flink 写 checkpoint 到 MySQL 会报错
Flink CDC 默认把 checkpoint offset 存在 MySQL 的 schema_change_history 表里,但从库是 read_only=ON,写操作直接被拒,报错 ERROR 1290 (HY000): The MySQL server is running with the --read-only option。
- 方案一(推荐):把
checkpoint.savepoint.dir改成 HDFS/S3/OSS 路径,完全避开 MySQL 写入 - 方案二:在从库临时关掉
read_only(SET GLOBAL read_only = OFF;),仅对 Flink 所用账号开SYSTEM_VARIABLES_ADMIN权限,但有安全风险 - 注意:Flink 1.17+ 支持
scan.startup.mode = 'latest-offset',跳过历史位点表,适合首次接入
字段类型映射不一致,Spark/Flink 解析 JSON 变成 null
MySQL 的 TINYINT(1) 常被业务当布尔用,但 Flink CDC 默认把它转成 BOOLEAN;而 Spark 读取 Kafka 中的变更消息时,若 schema 定义为 STRING,就会把整个 JSON 字段当字符串解析,最终字段值为 null。
- 在 Flink DDL 中显式指定
TINYINT(1) MAP TO BOOLEAN,或统一用BIT类型替代 - Kafka 消息体建议用 Debezium 的
avro序列化 + Schema Registry,比 JSON 更稳定 - 验证方式:消费 Kafka 主题后打印
value的schema,确认is_deleted这类字段类型是boolean而非string
server_uuid 必须唯一,且不能和主库或其他从库重复,否则 CDC client 会反复重连失败,日志里只显示超时,根本看不出是 UUID 冲突。











