现象
adapter日志中显示出了同步的数据,但是没有同步到备份数据库中
INFO c.a.o.canal.client.adapter.logger.LoggerAdapterExample - DML: {"data":[{........,"updatedAt":"2020-12-24 11:23:53"}],"pkNames":["id"],"sql":"","table":"test_user","ts":1611647428329,"type":"UPDATE"}
原因与方案
显示info日志只是adapter中的logger适配器,对接受到同步消息进行输出。
而同步写入数据需要另外的适配器,需要进一步配置,如下。
适配器匹配原理
每一adapter配置文件都会生产一个配置id,组成方式如下
- destination + "-" + groupId + "_" + database + "-" + table
分别对应:
- destination:config/xx/xxx.yml文件中的destination
- groupId:config/xx/xxx.yml文件中的groupId
- database: application.yml中srcDataSources.{xdb}.url中的database,如jdbc:mysql://10.0.0.10:3306/{database}?useUnicode=true
- table:config/xx/xxx.yml文件中的sql中的表名
如:userTopic-canalGroup_testdb-usertable
相关源码在OuterAdapter实现类中,如ESAdapter
原因1
- 没有匹配到数据源配置。新版本中使用application.yml中的outerAdapters.key和备份数据库配置中outerAdapterKey进行匹配。
- 解决方案:修改两个配置文件中的outerAdapters.key和outerAdapterKey进行匹配。
原因2:
- 没有匹配到adapter适配器,新版中使用application.yml中的outerAdapters.name进行适配。适配器有,es6/es7/hbase/kudu/logger/rdb。
- 解决方案:修改application.yml中的outerAdapters.name为适配器中的一项。
其他原因
- 根据adapter匹配id检查参数是否正确
同步成功会显示
Affected indexes: test_user