Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql数据同步Canal

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

作者:程序员1970

本文总结了Canal在启动和运行时常见的错误及其解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、启动常见错误

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

原因

解决方案

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

2. 权限不足

报错内容

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

原因

解决方案

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配置文件(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

原因

解决方案
检查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'

原因

解决方案

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

6. 内存不足

报错内容

hs_err_pid13418.log (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

原因

解决方案

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

2. 全量同步问题

报错内容

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

原因

解决方案

  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

原因

解决方案

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

原因

解决方案

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

5. 字段不匹配错误

报错内容

java.util.NoSuchElementException

原因

解决方案

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

6. 连接ES问题

报错内容

DocumentMissingException[_doc: document missing]

原因

解决方案

  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

原因

解决方案

  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;

到此这篇关于MySQL数据同步神器Canal常见错误总结的文章就介绍到这了,更多相关mysql数据同步Canal内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文