查看: 77|回覆: 0

MySQL数据同步神器Canal常见错误总结

[複製鏈接]

3

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2008-10-2
發表於 2025-12-23 11:53:14 | 顯示全部樓層 |閲讀模式

一、启动常见错误

1. 网络连接错误

报错内容

ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:[id: 0x23d9cad9, /127.0.0.1:46472 :> /127.0.0.1:11111], exception=java.nio.channels.ClosedChannelException

原因

  • Canal实例与MySQL主库之间的网络连接不稳定或中断
  • 防火墙设置阻止了Canal访问MySQL端口

解决方案

  1. 检查网络连接是否正常
  2. 确保防火墙允许Canal访问MySQL端口(默认3306)
  3. 增加网络重试机制提高稳定性

2. 权限不足

报错内容

ERROR c.a.otter.canal.parse.inbound.mysql.MysqlConnection - Error connecting to MySQL server

原因

  • Canal用户在MySQL上的权限不够,无法获取binlog信息

解决方案

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal_user'@'%' ;
FLUSH PRIVILEGES;

3. Binlog格式问题

报错内容

Received error packet: errno = 1236, sqlstate = HY000 errmsg = Could not find first log file name in binary log index file

原因

  • MySQL的binlog格式设置为ROW或MIXED以外的格式

解决方案

# 修改MySQL配置文件(my.cnf)
[mysqld]
binlog_format = ROW

重启MySQL服务后生效

4. Canal实例配置错误

报错内容

com.alibaba.otter.canal.parse.exception.CanalParseException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tableMetaTSDB' defined in class path resource [spring/tsdb/h2-tsdb.xml]: Cannot resolve reference to bean 'metaHistoryDAO' while setting bean property 'metaHistoryDAO'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaHistoryDAO' defined in class path resource [spring/tsdb/h2-tsdb.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring/tsdb/h2-tsdb.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property

原因

  • Canal实例的配置参数不正确,如数据库连接串、用户名、密码等

解决方案
检查conf/example/instance.properties文件,确保:

# mysql serverId
canal.instance.mysql.slaveId = 1234
# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=mysql-bin.000001
canal.instance.master.position=157
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456!

5. 驱动版本不兼容

报错内容

Unknown system variable 'query_cache_size'

原因

  • MySQL驱动包的版本过低,query cache在MySQL5.7.20已过时,MySQL8.0已移除

解决方案

  1. lib目录中的驱动包替换为mysql-connector-java-8.0.22.jar
  2. 修改驱动器权限

6. 内存不足

报错内容

hs_err_pid13418.log (JVM运行异常生成的日志文件)

原因

  • Canal启动时JVM内存不足

解决方案
修改Canal启动程序中的JVM配置,增加内存参数

二、运行时常见错误

1. meta.dat与instance.properties不一致

报错内容

ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:[id: 0x23d9cad9, /127.0.0.1:46472 :> /127.0.0.1:11111], exception=java.nio.channels.ClosedChannelException

原因

  • conf/example/meta.datinstance.properties文件中的journalName, position, timestamp不一致

解决方案

  1. meta.dat文件删除(生产环境需谨慎)
  2. 或修改instance.properties文件中的参数与meta.dat一致
  3. 重启Canal服务

2. 全量同步问题

报错内容

binlog也设置为000001了,timestamp也设置了,但就是无法实现全量同步

原因

  • binlog只记录增量操作,开启binlog之前的历史数据不会被记录

解决方案

  1. 删除conf/example/meta.dat
  2. 调整conf/example/instance.properties中的配置
  3. 重启deployer
  4. 如需同步历史数据,可采用以下方法:
    • 通过logstash-input-jdbc实现
    • 通过业务代码实现
    • 复制原数据库数据到开启了binlog的从数据库,然后从从数据库同步

3. adapter启动报错(空指针)

报错内容

adapter启动报错:something goes wrong when starting up the canal client adapters: java.lang.NullPointerException: null

原因

  • adapter配置文件中打开了不需要的配置项(如zookeeperHosts)但未配置具体值

解决方案

  1. 注释掉不需要的配置项
  2. 例如,不需要Zookeeper时,注释掉zookeeperHosts配置
  3. 或检查并正确配置所有必要参数

4. 配置文件格式错误

报错内容

Field error in object 'target' on field 'esMapping': rejected value [];
Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map<java.lang.String, java.lang.String>]

原因

  • 配置文件中配置项排版错误,特别是SQL语句语法问题

解决方案

  1. 检查es配置文件中的SQL语句语法
  2. 确保配置项排版正确,特别是_index, _type等属性要放在esMappings

5. 字段不匹配错误

报错内容

java.util.NoSuchElementException

原因

  • canal配置文件中的字段在ES mapping中找不到对应的字段
  • 字段大小写不一致或遗漏

解决方案

  1. 检查canal配置文件中的字段是否在ES mapping中有对应
  2. 确认大小写是否一致
  3. 确认sql中设置的别名是否与ES mappings中的名称一致

6. 连接ES问题

报错内容

DocumentMissingException[_doc: document missing]

原因

  • ES集群出现问题,分片数问题或数据不存在

解决方案

  1. 调整ES分片设置(单节点环境:主分片数=1,副本分片数=0)
  2. 确保数据在ES中存在(先进行全量同步,再进行增量同步)

7. 服务连接断开

报错内容

CanalClientException: java.io.IOException: Broken pipe Error sync but ACK

原因

  • 服务连接断开

解决方案

  1. 将deployer和adapter都关闭
  2. 先启动deployer
  3. 再启动adapter

8. 驱动包冲突

报错内容

com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource

原因

  • Druid包冲突

解决方案

  1. 修改client-adapter/escore/pom.xml
  2. 重新打包
  3. 替换adataper/plugin下的同名jar文件
  4. 给该文件赋权
  5. 重启服务

三、解决方案总结

错误类型报错内容解决方案
网络连接错误ClosedChannelException检查网络连接,确保防火墙允许访问
权限不足Error connecting to MySQL server授予REPLICATION SLAVE, REPLICATION CLIENT权限
Binlog格式问题Could not find first log file name修改MySQL配置,设置binlog_format=ROW
配置错误BeanCreationException检查instance.properties配置文件
驱动版本不兼容Unknown system variable 'query_cache_size'替换为MySQL 8.0驱动包
meta.dat不一致ClosedChannelException删除或修改meta.dat与instance.properties一致
全量同步失败无法实现全量同步删除meta.dat,调整配置,重启
adapter空指针NullPointerException: null注释掉不需要的配置项
配置格式错误rejected value []检查配置文件排版和SQL语法
字段不匹配NoSuchElementException检查字段大小写和ES mapping
ES连接问题DocumentMissingException调整ES分片设置,确保数据存在
服务连接断开Broken pipe Error sync but ACK先启动deployer,再启动adapter

四、最佳实践建议

版本匹配

Canal 1.1.6 + MySQL 8.0 + MySQL Connector 8.0.22

配置检查

# instance.properties
canal.instance.mysql.slaveId = 1234
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=mysql-bin.000001
canal.instance.master.position=157
canal.instance.dbUsername=canal
canal.instance.dbPassword=Canal@123456!
canal.instance.filter.regex=.*\\..*

初始化步骤

CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@123456!';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;
  • 全量同步处理
    • 删除conf/example/meta.dat
    • 调整instance.properties中的binlog起点
    • 重启Canal服务
  • 生产环境注意事项
    • 生产环境删除meta.dat前确认数据同步需求
    • 定期检查Canal日志
    • 监控Canal服务运行状态
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部