Question
Canal 增量同步日志正常,但是es中无数据,全量同步是没问题的。
adapter日志:
2022-07-26 11:33:03.986 [pool-2-thread-1] DEBUG c.a.o.canal.client.adapter.es.core.service.ESSyncService - DML: {"data":[{"max_receipted_at":null,"code":"STMT220726134GAD1C","supplier_ent_code":"SCEC210128YJNMT8G"}],"database":"supply-chain","destination":"supply-chain_statement","es":1658806383000,"groupId":"canal-consumer-supply-chain_statement","isDdl":false,"old":null,"pkNames":["code"],"sql":"","table":"statement","ts":1658806383977,"type":"INSERT"}
Affected indexes: supply-chain.base_order
日志中没有任何报错,但是es中没有数据,该从哪个方向去排查问题?
2条答案
按热度按时间mutmk8jj1#
@chenqi4547 以我的举例:
canal的项目代码质量很好,阅读体验不错,可惜就是文档写的太少了,希望能贡献一些,但是没找到入口。
参考下图:如果dml消息与yml配置文件的group、db、destination、table的配置不一致,会导致最下方的if语句不执行,也不打warn log(认为是开发自己的问题)。
lyr7nygr2#
@keel2008GitHub 感谢回复,这个问题昨天也通过DEBUG源码定位并解决了。
分析过程:
com.alibaba.otter.canal.client.adapter.es.core.service.ESSyncService#insert
方法中,调用了mainTableInsert()
方法。ESSyncUtil.pkConditionSql()
用于拼接主键条件,会解析es7.yml的sql中的主键,用于设置 where 条件concat
函数,导致解析出来的idColums
有两条记录,其中一条columName
为 null,导致condition
的值如图所示。问题原因:解析主键带有
concat
函数时,出现了columName
为 null 的数据。解决方法:
concat
函数。目前采用的避免使用函数解决的。