Canal Adapter写不到ES问题排查

922 阅读3分钟

前言

基本的配置可以在网上找找就可以了,配置的系统联通性很好判断就是系统启动有没报错。但是这里说下我这里碰到得全量/增量/更新/删除已经提示成功了、或者没报错,但是ES还是没数据的排查,在这里吐槽之下没后续日志的机制完全懵逼靠猜。本文先说下增量的问题,因为增量成功了我这里全量也好了。

mysql库依赖问题

  1. 首先可以自己替换下当前对应的mysql版本驱动包。
  2. 另外一个是用户密码的问题在网上自己找下设置下(为用户启用旧的身份验证插件【mysql_native_password】)

增量问题

一、首先要打开日志级别

image.png

<logger name="com.alibaba.otter.canal.client.adapter.es" additivity="false">
		<level value="TRACE" /><!--最高级别-->
		<appender-ref ref="STDOUT"/>
		<appender-ref ref="CANAL-ROOT" />
</logger>

二、接着后台有DML日志我们看下

2024-11-10 14:40:54.645 [pool-3-thread-1] INFO  c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{"ID":"01238f0d262106456d3a864247117b48","LOGIN_NAME":"ttt","USERNAME":"tt"}],"database":"zzcm","destination":"example","es":1731220850000,"groupId":"g1","isDdl":false,"old":[{"LOGIN_NAME":"tttt"}],"pkNames":["ID"],"sql":"","table":"sys_user","ts":1731220854645,"type":"UPDATE"}
2024-11-10 14:48:47.113 [pool-3-thread-1] INFO  c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{"ID":"01238f0d262106456d3a864247117b46","LOGIN_NAME":"tttt","USERNAME":"tt"}],"database":"zzcm","destination":"example","es":1731221326000,"groupId":"g1","isDdl":false,"old":null,"pkNames":["ID"],"sql":"","table":"sys_user","ts":1731221327113,"type":"DELETE"}
2024-11-10 14:48:56.823 [pool-3-thread-1] INFO  c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{"ID":"01238f0d262106456d3a864247117b99","LOGIN_NAME":"tttt","USERNAME":"tt"}],"database":"zzcm","destination":"example","es":1731221336000,"groupId":"g1","isDdl":false,"old":null,"pkNames":["ID"],"sql":"","table":"sys_user","ts":1731221336823,"type":"INSERT"}
  1. 结合代码(后面我会贴代码)我们要注意一些细节问题很关键都是字段名大小写问题导致的。
  2. 表:"table":"sys_user" 这里是小写。(这里会有个问题:在配置文件配置的sql主表匹配不到——》后台有DML语句但是没触发ES)
  3. 数据:[{"ID":"01238f0d262106456d3a864247117b99","LOGIN_NAME":"tttt","USERNAME":"tt"}] 表的字段这里是大写的。大小写导致数据获取不到为空

三、贴合部分代码截图看下(主要是获取值的部分)

es8_1.jpg

es8_0.jpg

es8_2.jpg

下面是取数的日志,注意TRACE的日志部分id一直是null;(idFieldName是配置的;fieldName是配置时候sql字段的别名;数据来自于DML;结合图2明白了大小写问题吧)

ESTemplate - dmlData:{ID=01238f0d262106456d3a864247117b48, LOGIN_NAME=tttt, USERNAME=tt}
ESTemplate - idFieldName:id,fieldName:id,columnName:id,value:null
ESTemplate - idFieldName:id,fieldName:login_name,columnName:login_name,value:null
ESTemplate - idFieldName:id,fieldName:username,columnName:username,value:null
ESSyncService - Single table insert to es index, destination:example, table: sys_user, index: sys_user, id: null

四、贴下我的测试的映射

我改成全大写了,但是出现了DML触发到了但是没有后续代码继续执行的问题!原因是表名的大小写造成的。(因为我这里还不知道DML后续路由的代码,这里就没在贴代码了)

dataSourceKey: defaultDS
destination: example
outerAdapterKey: es-key
groupId: g1
esMapping:
  _index: sys_user
  #_type: _doc
  _id: ID
  #upsert: true
  #pk: ID
  sql: "SELECT S.ID AS ID,S.LOGIN_NAME AS LOGIN_NAME,S.USERNAME AS USERNAME FROM SYS_USER S "
  #  objFields:
  #    _labels: array:;
  etlCondition: "where  login_name ='{0}'"
  commitBatch: 1

如果有不对的地方请留言