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里使用了``将表名括起来,导致未识别,如下所示
解决: 将``去掉即可