必须设binlog_format=ROW、server_id唯一且静态配置、log_bin开启并合理设置过期策略、授予REPLICATION SLAVE等最小必要权限,否则CDC工具将漏数据、报错或断连。

binlog 格式必须设为 ROW
MySQL 默认的 MIXED 或 STATEMENT 格式无法被大多数 CDC 工具(如 Debezium、Canal、Flink CDC)可靠解析,会漏变更或报错 Unsupported binlog format。
实操建议:
- 在
my.cnf中显式配置binlog_format = ROW,重启 MySQL 生效(仅SET GLOBAL临时生效,CDC 工具启动时可能已错过初始连接) - 确认生效:执行
SHOW VARIABLES LIKE 'binlog_format';,返回值必须是ROW - 注意:改格式后部分 DDL(如
ALTER TABLE ... ADD COLUMN)仍可能写入STATEMENT,需搭配binlog_row_image = FULL确保每行变更完整
server_id 未设置或全局不唯一
CDC 工具以「伪从库」身份拉取 binlog,MySQL 要求每个复制客户端必须有唯一 server_id。未设或重复会导致连接拒绝、位点跳变、甚至主从同步异常。
实操建议:
-
server_id必须在my.cnf的[mysqld]段中静态配置(不能只靠SET GLOBAL) - 多个 CDC 实例连同一 MySQL 实例时,每个实例的
server_id值必须不同(例如:101、102、103) - 验证方式:执行
SHOW VARIABLES LIKE 'server_id';,并与 CDC 配置中的server-id字段比对是否一致
binlog 开关与保留策略配置不当
CDC 工具依赖 binlog 文件持续可读。若 log_bin 关闭,或 expire_logs_days / binlog_expire_logs_seconds 过小,会导致工具断连后无法追平历史变更,报错 Could not find first log file name in binary log index file 或 Could not find specified binlog position。
实操建议:
- 确认
log_bin已启用(SHOW VARIABLES LIKE 'log_bin';返回ON),且路径可写 -
binlog_expire_logs_seconds(MySQL 8.0.28+)建议设为至少 86400(1 天),旧版本用expire_logs_days = 3 - 生产环境避免依赖自动清理,可配合定时脚本归档 + 清理,确保 CDC 故障恢复窗口内 binlog 不丢失
用户权限不足导致连接或读取失败
CDC 工具需要的权限远超普通应用账号。权限缺失通常表现为连接成功但无数据、频繁重连、或日志中出现 Access denied 类错误(尤其在执行 SHOW MASTER STATUS 或读取 mysql.ibd 时)。
实操建议:
- 最小必要权限组合:
SELECT,RELOAD,SHOW DATABASES,REPLICATION SLAVE,REPLICATION CLIENT - 建用户示例:
CREATE USER 'cdc_user'@'%' IDENTIFIED BY 'pwd'; GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cdc_user'@'%'; FLUSH PRIVILEGES; - 注意:MySQL 8.0+ 默认认证插件为
caching_sha2_password,部分老版 CDC 客户端不兼容,可显式指定IDENTIFIED WITH mysql_native_password
CDC 的真正难点不在配置项本身,而在于这些参数之间的隐式依赖——比如 binlog_format = ROW 不生效时,server_id 和权限再正确也拿不到有效事件;又比如 binlog_expire_logs_seconds 设得短,但 CDC 消费延迟高,就会直接断在半路。调通前务必逐项交叉验证,别只信配置文件里写了什么。










