开发者社区> 问答> 正文

canal 中mysql同步es报错空指针

canal1.1.7 mysql5.7 es:7.17

1.首先是canal1.1.7的yaml解析问题,我替换了源码中_id等字段,本地运行成功,全量同步没问题,增量同步不报错,但没有成功 2.在服务器上部署后能打印dml语句,但同步报错空指针(全量,增量都失败)

提问1.png

这是我的配置文件

提问2.png

确保启动成功

提问3.png

原提问者GitHub用户mileaw

展开
收起
白夜行fighting 2023-04-25 19:54:59 222 0
1 条回答
写回答
取消 提交回答
  • 问题出在配置文件,说下思路吧,希望能帮到大家

    ps:时间紧迫没有看canal的文档,通过wiki上的教程安装,看issue.....

    所有这块可能是我自己配置不规范的问题......

    源码打包有额外的两个yml配置(在es7文件夹中),我没有删除,所以这两个文件也被加载进配置,按理说不同的配置之间不会互相影响,所以我一开始没有管...

    这些配置文件会被ESSyncConfigLoader加载成ESSyncConfig对象,loader中通过Ymlutil工具类加载,这是加载部分的代码 if (baseProperties != null) { baseProperties.putAll(properties); properties = baseProperties; }

    baseProperties是方法参数,外部循环遍历所有的es相关yml,这里putAll把当前文件的配置放入baseProperties;

    如果所有的配置文件key类型都相同,这样覆盖没问题,但我的配置文件没有relation这个字段,而customer.yml中有 relations: customer_order: name: customer 循环遍历配置文件时先把relation写入到baseProperties中了,然而后面遍历我的yml配置时,上一次的relation没有被覆盖掉,

    这就导致解析我的配置时把上一个配置文件中的relations一起加载成了ESSyncConfig对象;

    最后运行时putRelationDataFromRS(mapping, schemaItem, resultSet, esFieldData);就会空指针

    解决方法:

    1.把其他两个文件删了(我目前只用一个yml就ok)

    2.修改ymlutil,用完后在baseProperties中清除本次用于绑定到ESSyncConfig的配置

    原回答者GitHub用户mileaw

    2023-04-26 17:04:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像