MySQL binlog + CDC 工具实现变更捕获的常见配置坑

11次阅读

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

MySQL binlog + CDC 工具实现变更捕获的常见配置坑

binlog 格式必须设为 ROW

mysql 默认的 MIXEDSTATEMENT 格式无法被大多数 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 fileCould 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 消费延迟高,就会直接断在半路。调通前务必逐项交叉验证,别只信配置文件里写了什么。

text=ZqhQzanResources