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
原因:
- Canal实例与MySQL主库之间的网络连接不稳定或中断
- 防火墙设置阻止了Canal访问MySQL端口
解决方案:
- 检查网络连接是否正常
- 确保防火墙允许Canal访问MySQL端口(默认3306)
- 增加网络重试机制提高稳定性
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已移除
解决方案:
- 将
lib目录中的驱动包替换为mysql-connector-java-8.0.22.jar - 修改驱动器权限
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.dat与instance.properties文件中的journalName, position, timestamp不一致
解决方案:
- 将
meta.dat文件删除(生产环境需谨慎) - 或修改
instance.properties文件中的参数与meta.dat一致 - 重启Canal服务
2. 全量同步问题
报错内容:
binlog也设置为000001了,timestamp也设置了,但就是无法实现全量同步
原因:
- binlog只记录增量操作,开启binlog之前的历史数据不会被记录
解决方案:
- 删除
conf/example/meta.dat - 调整
conf/example/instance.properties中的配置 - 重启deployer
- 如需同步历史数据,可采用以下方法:
- 通过logstash-input-jdbc实现
- 通过业务代码实现
- 复制原数据库数据到开启了binlog的从数据库,然后从从数据库同步
3. adapter启动报错(空指针)
报错内容:
adapter启动报错:something goes wrong when starting up the canal client adapters: java.lang.NullPointerException: null
原因:
- adapter配置文件中打开了不需要的配置项(如
zookeeperHosts)但未配置具体值
解决方案:
- 注释掉不需要的配置项
- 例如,不需要Zookeeper时,注释掉
zookeeperHosts配置 - 或检查并正确配置所有必要参数
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语句语法问题
解决方案:
- 检查es配置文件中的SQL语句语法
- 确保配置项排版正确,特别是
_index,_type等属性要放在esMappings下
5. 字段不匹配错误
报错内容:
java.util.NoSuchElementException
原因:
- canal配置文件中的字段在ES mapping中找不到对应的字段
- 字段大小写不一致或遗漏
解决方案:
- 检查canal配置文件中的字段是否在ES mapping中有对应
- 确认大小写是否一致
- 确认sql中设置的别名是否与ES mappings中的名称一致
6. 连接ES问题
报错内容:
DocumentMissingException[_doc: document missing]
原因:
- ES集群出现问题,分片数问题或数据不存在
解决方案:
- 调整ES分片设置(单节点环境:主分片数=1,副本分片数=0)
- 确保数据在ES中存在(先进行全量同步,再进行增量同步)
7. 服务连接断开
报错内容:
CanalClientException: java.io.IOException: Broken pipe Error sync but ACK
原因:
- 服务连接断开
解决方案:
- 将deployer和adapter都关闭
- 先启动deployer
- 再启动adapter
8. 驱动包冲突
报错内容:
com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource
原因:
- Druid包冲突
解决方案:
- 修改
client-adapter/escore/pom.xml - 重新打包
- 替换
adataper/plugin下的同名jar文件 - 给该文件赋权
- 重启服务
三、解决方案总结
| 错误类型 | 报错内容 | 解决方案 |
|---|---|---|
| 网络连接错误 | 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服务运行状态
- 生产环境删除
到此这篇关于MySQL数据同步神器Canal常见错误总结的文章就介绍到这了,更多相关mysql数据同步Canal内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
