前言
基本的配置可以在网上找找就可以了,配置的系统联通性很好判断就是系统启动有没报错。但是这里说下我这里碰到得全量/增量/更新/删除已经提示成功了、或者没报错,但是ES还是没数据的排查,在这里吐槽之下没后续日志的机制完全懵逼靠猜。本文先说下增量的问题,因为增量成功了我这里全量也好了。
mysql库依赖问题
- 首先可以自己替换下当前对应的mysql版本驱动包。
- 另外一个是用户密码的问题在网上自己找下设置下(为用户启用旧的身份验证插件【mysql_native_password】)
增量问题
一、首先要打开日志级别
<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"}
- 结合代码(后面我会贴代码)我们要注意一些细节问题很关键都是字段名大小写问题导致的。
- 表:"table":"sys_user" 这里是小写。(这里会有个问题:在配置文件配置的sql主表匹配不到——》后台有DML语句但是没触发ES)
- 数据:[{"ID":"01238f0d262106456d3a864247117b99","LOGIN_NAME":"tttt","USERNAME":"tt"}] 表的字段这里是大写的。大小写导致数据获取不到为空
三、贴合部分代码截图看下(主要是获取值的部分)
下面是取数的日志,注意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
如果有不对的地方请留言