所有报错均为博客在实操过程中遇到的错误和解决办法,如果有其他报错或者不同的解决办法,请留言告诉我
安装canal过程中遇到问题,先在本文中查询是否有相同报错,将会为你节约大量排错时间
环境jdk1.8 canal 1.1.5 mysql8.0 es7.13.01. Unknown system variable ‘query_cache_size’
这是因为mysql驱动包的版本过低导致的,query cache在MySQL5.7.20就已经过时了,而在MySQL8.0之后就已经被移除了
1、只需要将lib中的驱动器替换成mysql-connector-java-8.0.22.jar
2、修改驱动器权限
chmod 777 lib/mysql-connector-java-8.0.22.jar chmod +st lib/mysql-connector-java-8.0.22.jar
查看权限如图所示
ll lib2. Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map
启动canal-adapter报错:
Failed to bind properties under 'canal.conf.canal-adapters[0].groups[0].outer-adapters[1].properties' to java.util.Map: Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map ]
解决:
观察报错信息可以得知是配置文件中的outer2(0基,所以outer-adapter[1]实际指的是2)的properties配置有问题,我们观察配置文件,发现是properties下的mode,cluster.name等属性与properties同级了,将其如下图所示后退两字符即可。
这个因为在conf/es/xxx.yml中配置的dataSourceKey并没有在conf/application.yml中的srcDataSources中维护
如下图所示,es中的dataSourceKey需要在applicaiton.yml中设置,默认是defaultDS
Failed to bind properties under 'canal.conf' to com.alibaba.otter.canal.adapter.launcher.config.AdapterCanalConfig:
Reason: Unable to set value for property src-data-sources
mysql驱动器导致的问题,使用的数据库是8.x。驱动器是5.x的,将mysql驱动替换为8.0.x版本的。如上所示报错1
5. java.sql.SQLException: null, message from server: “Host ‘172.16.188.2’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’”同一个ip在短时间内产生太多中断的数据库连接而导致的阻塞
登录对应的mysql,执行如下指令
flush hosts;6. IllegalStateException: Extension instance(name: es7, class: interface com.alibaba.otter.canal.client.adapter.OuterAdapter) could not be instantiated: class could not be found
一般could not be instantiated: class could not be found这样的报错是配置文件的问题,如上的报错可以看到是name: es7中的错误,在官方的示例文档中使用的是name: es6 # or es7。但在1.1.4版本中直接使用name: es即可
7. IllegalArgumentException: Not found the mapping info of index: user1、这个报错是ES的mapping设置的问题,确保es中有该索引,并且确认是否有部分字段没有在es中设置mapping,这个要对应之前设置的sql,以及es中的mappings来解决
2、使用了elasticsearch 7.x,但adapter1.1.4默认支持es6.x
解决方案:
(1)修改adapter源码,将es依赖调整为7.x;参考博客adapter1.1.4修改源码支持es7.x
(2)换成adapter1.1.5
如果连接es使用的是rest方式,那么hosts中的ip前要添加http://,如
hosts: http://172.16.188.7:92009. com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.ClassCastException: com.alibaba.druid.pool.DruidDataSource cannot be cast to com.alibaba.druid.pool.DruidDataSource at com.alibaba.otter.canal.client.adapter.es7x.ES7xAdapter.init(ES7xAdapter.java:54) ~[client-adapter.es7x-1.1.5-jar-with-dependencies.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterLoader.loadAdapter(CanalAdapterLoader.java:225) [client-adapter.launcher-1.1.5.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterLoader.init(CanalAdapterLoader.java:56) [client-adapter.launcher-1.1.5.jar:na] at com.alibaba.otter.canal.adapter.launcher.loader.CanalAdapterService.init(CanalAdapterService.java:60) [client-adapter.launcher-1.1.5.jar:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_271] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_271] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_271] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_271]
原因:
druid 包冲突
解决:
1、修改client-adapter/escore/pom.xml
com.alibaba druidprovided
2、重新打包
3、将client-adapter/es7x/target/client-adapter.es7x-1.1.5-jar-with-dependencies.jar上传到服务器,替换adataper/plugin下的同名jar文件
scp client-adapter.es7x-1.1.5-jar-with-dependencies.jar root@172.16.188.2:/var/local
4、给该文件赋权
chmod 777 /var/local/client-adapter.es7x-1.1.5-jar-with-dependencies.jar
5、重启服务
10 CanalParseException: java.io.IOException: EOF encountered将lib目录下的mysql驱动器替换为mysql8.0,并附权。参考上述
11. CanalClientException: java.io.IOException: Broken pipe Error sync but ACK服务连接断开了,将deployer和adapter都关闭,先启动deployer再启动adapter
12. documentMissingException[[_doc][1413298413755211778]: document missing]1、es集群出现问题,导致doc无法分配。常见的是分片数的问题,可能是副本分片过多,导致集群报黄
解决:
因为我的是es单节点,所以将主分片数设置为1,副本分片设置为0。不申明的话默认创建副本分片数为1
PUT user
{
"mappings": {
"properties": {
"code": {
"type": "keyword"
},
"email": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"realName": {
"type": "text",
"analyzer": "ik_smart",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"roleId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"postId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"deptId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
},
"settings": {
"number_of_replicas": 0,
"number_of_shards": 1
}
}
2、修改的mysql数据库数据,在es中不存在。先进行全量同步,再进行增量同步
在conf/example/instance.properties中修改
# 全量同步 canal.instance.master.journal.name=mysql-bin.000001 canal.instance.master.position=0 #2019-01-01 00:00:00 上一次更新的时间 canal.instance.master.timestamp=154627200000013. ERROR c.a.otter.canal.server.netty.handler.SessionHandler - something goes wrong with channel:[id: 0x23d9cad9, /127.0.0.1:46472 :> /127.0.0.1:11111], exception=java.nio.channels.ClosedChannelException
这是由于deployer中的conf/example/meta.dat与instance.properties文件中的journalName,position,timestamp不一致导致的
# 查询bin log位置 show master status; # 如果显示的binlog不为000001可以执行以下语句重置binlog(轻易别操作,最好让专业的运维人员操作) reset master; # 刷新log日志,自此刻开始产生一个新编号的binlog日志文件 flush logs;
将meta.dat删除或者修改一致即可。删除后将会按照instance.properties中设置的起点同步,生产环境考虑好需要后再删除。
mysql bin log数据不同步,刷新一下即可
flush logs;15. binlog也设置为000001了,timestamp也设置了,但就是无法实现全量同步
1、删除conf/example/meta.dat
2、调整conf/example/instance.properties
canal.instance.master.journal.name=mysql-bin.000001 canal.instance.master.position=0 #2019-01-01 00:00:00 上一次更新的时间 canal.instance.master.timestamp=1546272000000
3、重启deployer
另外需要注意的是如果bin log是只会记录增量操作的,也就是说开启bin log之前的历史数据是不会记录的,如果需要同步者之前的数据,解决这个问题有三个办法:
(1)通过logstash-input-jdbc来实现
(2)通过业务代码来实现(后续会详细讲解这两种方式,可以关注我后续的博客)
(3)复制原数据库数据到开启了binlog的从数据库,然后从从数据库同步



