MySQL必须开启ROW格式binlog并配置server-id,创建含REPLICATION SLAVE/CLIENT权限的专用账号,Canal实例配置需匹配MySQL地址、slaveId及账号信息,同步至Redis/ES须通过官方adapter实现。

MySQL必须先配好binlog,否则Canal连连接都建立不了
Canal本质是伪装成MySQL从库,靠主从复制协议拉取binlog。如果MySQL没开binlog,或者格式不是ROW,Canal启动后会直接报错退出,日志里常见:ERROR c.a.o.c.c.i.CanalInstanceWithManager - start cannal failed 或 java.io.IOException: Received error packet: errno = 1236(通常是binlog格式不匹配或position越界)。
必须在/etc/my.cnf的[mysqld]段确认以下几项:
-
log-bin=mysql-bin—— 开启binlog,文件名不能带路径,只写基础名 -
binlog-format=ROW—— 必须是ROW,STATEMENT或MIXED会导致Canal解析失败或漏数据 -
server-id=1—— 值必须唯一,且不能和Canal配置里的slaveId冲突(默认是1234,所以这里别设成1234) -
expire-logs-days=7—— 避免磁盘被binlog占满,生产环境建议设
改完重启MySQL:sudo systemctl restart mysqld,再进MySQL执行:show variables like 'log_bin'; 和 show variables like 'binlog_format';,两个结果都必须是ON和ROW。
创建专用账号并授权,权限缺一不可
Canal不是用root连MySQL,必须建一个最小权限账号。少授任何一条,启动时就会卡在“connecting to destination”或抛Access denied异常。
登录MySQL后执行:
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; FLUSH PRIVILEGES;
注意三点:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
REPLICATION SLAVE是核心权限,没有它,Canal无法发起dump请求 -
REPLICATION CLIENT用于获取binlog位置、master状态等元信息,漏掉会导致Canal无法定位起始位点 - 不要用
GRANT ALL——Canal根本不需要DROP或CREATE权限,过度授权是安全风险
验证方式:用该账号手动连一次:mysql -ucanal -pcanal -h your-mysql-ip -e "SHOW MASTER STATUS;",能成功返回就说明权限到位。
Canal Server启动失败,大概率是conf/example/instance.properties配错了
Canal解压后默认走conf/example这个instance,它的instance.properties是实际运行依据。新手常在这里填错三处:
-
canal.instance.mysql.slaveId=1234—— 必须和MySQL的server-id不同,否则MySQL拒绝推送 -
canal.instance.master.address=192.168.1.100:3306—— 地址必须是MySQL真实监听IP,不能写localhost或127.0.0.1(Canal Server和MySQL不在同一台机器时尤其注意) -
canal.instance.dbUsername=canal和canal.instance.dbPassword=canal—— 密码明文填,别加引号;如果MySQL用了caching_sha2_password插件(MySQL 8.0默认),需额外在JDBC URL里加&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
启动前务必检查:tail -f logs/example/example.log,刚启动时关键线索都在这。如果看到parse faield或connect to mysql fail,优先翻这行上下文,比看控制台输出更准。
同步到Redis或ES,别直接写Canal客户端代码
Canal本身只负责解析binlog并投递事件,真正写Redis或ES得靠适配器(adapter)。硬写TCP客户端容易丢事件、难处理事务边界、也无法自动重试。
推荐用官方canal-server + canal-adapter组合:
- Redis同步:启用
redisadapter,配置application.yml里指定database和table映射规则,支持HASH结构存整行、KEY按主键生成 - ES同步:用
esadapter,注意ES版本要和adapter编译版本对齐(比如ES 7.x对应canal.adapter.es7模块),mapping字段类型必须和MySQL列类型一致,否则bulk写入会失败 - 所有adapter的配置文件路径是
conf/application.yml,改完必须重启bin/startup.sh,热加载不生效
最易忽略的一点:Canal默认只监听example实例,如果你改了instance名(比如叫order_sync),就必须同步改canal-adapter/conf/application.yml里的canalAdapters:下instances:列表,否则adapter根本收不到任何数据。

















