百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Canal报错总结,总算是跑起来了 can错误处理机制

liebian365 2024-11-09 13:48 25 浏览 0 评论

总算是跑起来了,看看效果吧

这是我的SQL

表里面插入数据

刷新下就可以看到已经查询出来了

canal报错nosuchmethod ..bytebuffer

解决方法:更新jdk版本与es一致

cancal报错 config dir not found

替换classpath中间封号两边的值

canal控制台乱码

将其改为GBK即可

ERROR c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - java.lang.NullPointerException


网上都说是需要改yml里面的SQL,表要设置别名,然而我试了,没有效果。。。 没办法,debug源码看看,这边能看到,是别名不匹配导致的

这里为null导致的异常,一看就是个BUG,这里呢继续跟踪,追到下面能看到解析的时候使用了sqlidentifierexpr,导致owners为空

如果不想为空,需要让他走sqlpropertyexpr,那么如何让他走呢?

要给所有字段加上别名才行,这样问题就解决啦

Unknown system variable \'query_cache_size\'

这是因为mysql驱动包的版本过低导致的,query cache在MySQL5.7.20就已经过时了,而在MySQL8.0之后就已经被移除了 1、只需要将lib中的驱动器替换成mysql-connector-java-8.0.22.jar 2、修改驱动器权限

Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map]

启动canal-adapter报错:

观察报错信息可以得知是配置文件中的outer2(0基,所以outer-adapter[1]实际指的是2)的properties配置有问题,我们观察配置文件,发现是properties下的mode,cluster.name等属性与properties同级了,将其如下图所示后退两字符即可。

RuntimeException: java.lang.RuntimeException: No data source found: xxxx

这个因为在conf/es/xxx.yml中配置的dataSourceKey并没有在conf/application.yml中的srcDataSources中维护 如下图所示,es中的dataSourceKey需要在applicaiton.yml中设置,默认是defaultDS

Reason: Unable to set value for property src-data-sources

原因一: mysql驱动器导致的问题,使用的数据库是8.x。驱动器是5.x的,将mysql驱动替换为8.0.x版本的。如上所示报错1 原因二: 检查该报错前的日志,是否有其他相关报错信息,比如无相关数据库,如下所示,根据其报错内容来检查配置项并且调整即可

java.sql.SQLException: null, message from server: "Host \'172.16.188.2\' is blocked because of many connection errors; unblock with \'mysqladmin flush-hosts\'"

同一个ip在短时间内产生太多中断的数据库连接而导致的阻塞 登录对应的mysql,执行如下指令

IllegalStateException: Extension instance(name: es7, class: interface com.alibaba.otter.canal.client.adapter.OuterAdapter) could not be instantiated: class could not be found

一般 could not be instantiated: class could not be found这样的报错是配置文件的问题,如上的报错可以看到是name: es7中的错误,在官方的示例文档中使用的是name: es6 # or es7。 在canal1.1.5+版本中设置的是name: es6 # 或者es7 但在1.1.4版本中直接使用name: es即可

IllegalArgumentException: Not found the mapping info of index: user

1、这个报错是ES的mapping设置的问题,确保es中有该索引,并且确认是否有部分字段没有在es中设置mapping,这个要对应之前设置的sql,以及es中的mappings来解决 2、使用了elasticsearch 7.x,但adapter1.1.4默认支持es6.x 解决方案: (1)修改adapter源码,将es依赖调整为7.x;参考博客adapter1.1.4修改源码支持es7.x (2)换成adapter1.1.5

IllegalArgumentException: Illegal character in scheme name at index 0: 172.16.188.7:9200

如果连接es使用的是rest方式,那么hosts中的ip前要添加http://,如![image.png](https://cdn.nlark.com/yuque/0/2023/png/548519/1689909892862-4c86b65c-0bb7-4d9e-b8a4-c184f8cf52a0.png#averageHue=%23f6f6f6&clientId=u17c58d74-18fb-4&from=paste&height=232&id=u03889a1e&originHeight=290&originWidth=900&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=15171&status=done&style=none&taskId=uc4ce2cbd-8d81-44d5-8531-8ed94afadba&title=&width=720)

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

原因: druid 包冲突 解决: 1、修改client-adapter/escore/pom.xml

2、重新打包

3、将client-adapter/es7x/target/client-adapter.es7x-1.1.5-jar-with-dependencies.jar上传到服务器,替换adataper/plugin下的同名jar文件

4、给该文件赋权

5、重启服务

CanalParseException: java.io.IOException: EOF encountered

将lib目录下的mysql驱动器替换为mysql8.0,并附权。参考上述

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

服务连接断开了,将deployer和adapter都关闭,先启动deployer再启动adapter

DocumentMissingException[_doc: document missing]

1、es集群出现问题,导致doc无法分配。常见的是分片数的问题,可能是副本分片过多,导致集群报黄 解决: 因为我的是es单节点,所以将主分片数设置为1,副本分片设置为0。不申明的话默认创建副本分片数为1

2、修改的mysql数据库数据,在es中不存在。先进行全量同步,再进行增量同步 在conf/example/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

这是由于deployer中的conf/example/meta.dat与instance.properties文件中的journalName,position,timestamp不一致导致的

将meta.dat删除或者修改一致即可。删除后将会按照instance.properties中设置的起点同步,生产环境考虑好需要后再删除。 如果想要将之前的数据也同步的话,可以将数据库先导出,再重新导入一遍,即可重新生成binlog,实现数据的全量同步

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

mysql bin log数据不同步,刷新一下即可

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

1、删除conf/example/meta.dat 2、调整conf/example/instance.properties

3、重启deployer 另外需要注意的是如果bin log是只会记录增量操作的,也就是说开启bin log之前的历史数据是不会记录的,如果需要同步者之前的数据,解决这个问题有三个办法: (1)通过logstash-input-jdbc来实现 (2)通过业务代码来实现(后续会详细讲解这两种方式,可以关注我后续的博客) (3)复制原数据库数据到开启了binlog的从数据库,然后从从数据库同步

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

这个报错是空指针报错,很明显是哪里获取为空的,这种错误没有固定的原因,但大概率上可以锁定配置文件的问题 1、adapter的配置文件中是有包含了mysql、es、mq、zk等配置,如果不需要的配置项,就将其注释掉,不要打开 比如我这里的报错原因就是因为打开了zookeeperHosts,但是没有配置具体值,所以导致了空指针,因为我不需要zk,将其注释掉即可

2、某些必要的配置没有设置,快速排查的方式就是根据官方文档中给出的配置文件对比排错 可以参考如下配置文件 3、配置文件中配置项排版错位

Field error in object \'target\' on field \'esMapping\': rejected value [];

这是配置文件问题,检查es下的配置yml文件,特别是sql语句的语法是否有问题

java.util.NoSuchElementException

没有找到对应字段导致 检查下canal配置文件中的字段是否在es mapping中有对应的,大小写是否一致,是否有遗漏 因为我的操作是mysql同步至es,所以这里说明几项容易出错的地方: 1、canal配置文件中的sql中是否大小写一致,canal是区分大小写的 2、sql中设置的别名是否与es mappings中的名称一致,允许es中的部分字段为空,但是不允许sql中查询出来的字段在es mappings中找不到对应的字段 3、canal配置文件中的dataSourceKey是否正确,其对应到canal application.yml配置文件中的数据库是否正确

application.yml

4、canal配置文件中的排版是否正确,特别注意_index,_type等属性要放在esMappings下 5、sql查询出来的字段类型与es mappings中的字段数据类型是否一致

adapter日志中没有报错,但是没有读取binlog | Could not find first log file name in binary log index file

adapter日志中没有报错信息,于是去查看deployer日志,这里的example是你配置的实例

会发现报错

解决: 1、既然问题是没有找到数据库的binglog文件位置,那么就查看一下现在的binlog文件位置,登陆mysql执行 2.1 如果你是做增量同步,那么查询当前binlog位置

修改conf/example/instance.properties文件

2.2 如果你要做全量同步,查询binlog文件

3、重启deployer和adapter

CanalParseException: parse row data failed. | column size is not match for table

deployser日志报错:

解决: 1、可以看到报错中已经给出明确提示了

2、该错误官方中有解释 官方文档 TableMetaTSDB 在instance.properties中设置

3、一般将这个开启就解决了,但是我这里即时将其开启还是报错,查阅相关资料有说将canal.instance.tsdb.enable设置为false后重启解决的,但是我这里将其设置为false后依旧没有解决 实在没有其他办法了,查阅官方github,导致这个问题发生的原因是因为表结构发生过变化,但是binlog中读取到的与现在的表结构不一致导致。 于是直接跳过该binlog checkpoint,也就是将binlog的读取位置设置为当前的最新binlog位置 (1)查阅当前binlog最新位置,mysql中执行

(2)将读取位置该为最新,修改deployer conf/example/instance.properties

3)重启deployer , adapter (4)因为读取的是最新的binlog。为了把当前的数据同步进来,将需要同步的表或库导出,然后再导入一遍。问题解决(注意:这里的解决方案要谨慎,生产环境因为时时刻刻在产生数据,可行性很低,所以看要么设置一个停机维护来进行实操)

use gtid and TableMeta TSDB should be config timestamp > 0

在instance.properties中设置时间戳

RuntimeException: com.alibaba.fastjson.JSONException: unclosed string

该错误是因为sql中使用了group_concat函数,但是该函数默认长度是1024,超过的会被截取,导致出现了json格式的数据格式不正确,没有正确的关闭json

解决: 1、修改my.cnf,扩大group_concat_max_len

2、重启mysql

MySQLSyntaxErrorException: Unknown column \'_v._id\' in \'where clause\'

sql中没有_id字段导致,使用as将id命名别名:select id as _id

adapter中有同步日志打印,但es中数据未同步

我这里出现这个问题是在canal1.1.6版本中,原因是es7文件夹中的.yml文件中书写的sql里使用了``将表名括起来,导致未识别,如下所示

解决: 将``去掉即可

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: