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

4 阅读6分钟

一、启动常见错误

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

AI写代码
1

原因

  • 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

AI写代码
1

原因

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

解决方案

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

AI写代码sql
12

3. Binlog格式问题

报错内容

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

AI写代码
1

原因

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

解决方案

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

AI写代码ini
123

重启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

AI写代码
1

原因

  • 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!

AI写代码properties
1234567891011

5. 驱动版本不兼容

报错内容

Unknown system variable 'query_cache_size'

AI写代码
1

原因

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

解决方案

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

6. 内存不足

报错内容

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

AI写代码
1

原因

  • 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

AI写代码
1

原因

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

解决方案

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

2. 全量同步问题

报错内容

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

AI写代码
1

原因

  • 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

AI写代码
1

原因

  • 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>]

AI写代码
12

原因

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

解决方案

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

5. 字段不匹配错误

报错内容

java.util.NoSuchElementException

AI写代码
1

原因

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

解决方案

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

6. 连接ES问题

报错内容

DocumentMissingException[_doc: document missing]

AI写代码
1

原因

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

解决方案

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

7. 服务连接断开

报错内容

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

AI写代码
1

原因

  • 服务连接断开

解决方案

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

8. 驱动包冲突

报错内容

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

AI写代码
1

原因

  • 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

四、最佳实践建议

  1. 版本匹配

    • Canal 1.1.6 + MySQL 8.0 + MySQL Connector 8.0.22
  2. 配置检查

    # 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=.*\..*
    
    AI写代码properties
    12345678
    
  3. 初始化步骤

    CREATE USER 'canal'@'%' IDENTIFIED BY 'Canal@123456!';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
    FLUSH PRIVILEGES;
    SHOW MASTER STATUS;
    
    AI写代码sql
    1234
    
  4. 全量同步处理

    • 删除conf/example/meta.dat
    • 调整instance.properties中的binlog起点
    • 重启Canal服务
  5. 生产环境注意事项

    • 生产环境删除meta.dat前确认数据同步需求
    • 定期检查Canal日志
    • 监控Canal服务运行状态