Canal连不上MySQL主因是权限或binlog格式不匹配:必须授予canal用户REPLICATION SLAVE、REPLICATION CLIENT及SELECT权限,且binlog_format必须为ROW、binlog_row_image必须为FULL。

Canal 连不上 MySQL,90% 是权限或 binlog 格式没配对 —— 不是网络问题,也不是 Canal 自身 bug。
REPLICATION SLAVE 和 REPLICATION CLIENT 必须同时给,且 ON *.*
Canal 伪装成从库拉取 binlog event,本质是发起 COM_BINLOG_DUMP 协议请求。这需要两个权限缺一不可:
-
REPLICATION SLAVE:允许建立 dump 连接、读取 binlog event 流 -
REPLICATION CLIENT:允许执行SHOW MASTER STATUS获取当前 binlog 文件名和位点
常见错误是只授了 REPLICATION SLAVE,结果 Canal 启动时报 Access denied; you need (at least one of) the REPLICATION CLIENT privilege(s)。
正确操作(MySQL 5.7+ / 8.0 均适用):
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
注意:ON *.* 不能写成 ON mydb.* 或 ON *.* 加条件,MySQL 不支持细粒度授权;SELECT 权限用于初始全量快照,也必须带上。
binlog_format 必须为 ROW,且 binlog_row_image = FULL
Canal 解析的是行级变更事件,不是 SQL 文本。若 binlog_format 是 STATEMENT 或 MIXED,它要么收不到事件,要么解析出错(比如 UUID()、NOW() 导致主从不一致)。
检查命令:
SHOW VARIABLES LIKE 'binlog_format'; -- 必须返回 ROW SHOW VARIABLES LIKE 'binlog_row_image'; -- 必须返回 FULL
临时设置(重启失效):
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
SET GLOBAL binlog_format = 'ROW'; SET GLOBAL binlog_row_image = 'FULL';
永久生效:在 /etc/my.cnf 的 [mysqld] 段下加:
log-bin=mysql-bin binlog-format=ROW binlog_row_image=FULL server-id=1
改完必须重启 MySQL,且首次启动会生成新 binlog 文件(如 mysql-bin.000001),Canal 应从此处开始读,不能回溯旧文件里的非 ROW 日志。
MySQL 8.0+ 用户认证插件可能让 Canal 握手失败
MySQL 8.0 默认用 caching_sha2_password,但 Canal(尤其老版本)只支持 mysql_native_password。现象是连接成功但立即断开,日志里没有明显报错,只看到反复重连。
解决方法(针对 Canal 用户):
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
别改 root 或其他业务账号,只动同步专用账号。改完不用 FLUSH PRIVILEGES,该语句本身已生效。
别被 BINLOG MONITOR 权限带偏
MySQL 8.0.22+ 引入的 BINLOG MONITOR 权限,**和 Canal 完全无关**。它只用于 SHOW BINARY LOGS、SHOW BINLOG EVENTS 等 DBA 管理命令,不是 binlog 拉取必需项。
如果你在 GRANT 里加了它,MySQL 可能报错 ERROR 3715 (HY000): Access denied; you need (at least one of) the BINLOG MONITOR privilege(s),但这只是提示你语法有误,不是 Canal 缺这个权限。
真正要盯住的只有三件事:REPLICATION SLAVE、REPLICATION CLIENT、ROW 格式 —— 其他都是干扰项。

















