使用Canal将MySQL数据同步到ES(Linux)

一、Canal官网文档

去到官方文档根据官网文档进行操作:

QuickStart · alibaba/canal Wiki · GitHub阿里巴巴 MySQL binlog 增量订阅&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.[这里是图片002]https://github.com/alibaba/canal/wiki/QuickStart

二、开启服务器中MySQL的binlog

复制代码
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复

进行修改:

登录root

复制代码
mysql -uroot -p

CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

改完后可以在MySQL命令行中使用下面的指令查看是否开启成功,value为ON就是开启成功:

复制代码
show variables like 'log_bin';

注意注意:记得修改后一定要重启MySQL,我就是因为忘记重启了找了一天的bug ,不记得重启会出现后面第八点那个问题。

三、将canal-deployer下载到服务器

Releases · alibaba/canal · GitHub阿里巴巴 MySQL binlog 增量订阅&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.[这里是图片008]https://github.com/alibaba/canal/releases

复制代码
cd /tmp/canal
tar zxvf canal.deployer-1.1.8-SNAPSHOT.tar.gz

解压后:

建议这边弄一个单独的文件夹把压缩包放进去再去解压,不然后面还有其他的会比较影响

弄一个类似这种文件夹,在对应的文件夹里面放压缩包,再去解压,后面我都是这种步骤,由于没有保留截图,上面那些还是最开始的演示,建议后面修改一下。

四、修改对应配置文件

五、启动canal 服务端

启动指令:

复制代码
sh bin/startup.sh

关闭指令:

复制代码
sh bin/stop.sh

参考:linux下启动Nacos报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)_java_silence_fengxuan-GitCode 开源社区[这里是图片018]https://gitcode.csdn.net/66c6f8970bfad230b8ae80c9.html?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6Mzg2MzQyMiwiZXhwIjoxNzMzNDk5ODYyLCJpYXQiOjE3MzI4OTUwNjIsInVzZXJuYW1lIjoicXFfNzM0NDA3NjkifQ.ePhIrfy6Hut8CjhuMD9jTFiIlnDuk4ArxnuI_l1Bkvc&spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-1-105581366-blog-125775825.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-1-105581366-blog-125775825.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=2

这个是我服务器jdk下载的位置,去找到自己对应的位置即可,后面我改用jdk11了,11是没问题的,记得17可能有些问题,可以参考下面这个步骤来就行,版本可以用11。

jdk下载可以参考这篇博客:

linux下载安装jdk教程_linux jdk下载-CSDN博客文章浏览阅读3.3k次,点赞16次,收藏27次。JDK是 Java 语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源。_linux jdk下载[这里是图片019]https://blog.csdn.net/qq_44869932/article/details/141396367

编辑下面这个文件

在这个文件内添加下面信息

复制代码
export JAVA_HOME=/www/server/java/jdk-17.0.8/          
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

修改完,重新加载一下:

复制代码
source /etc/profile

然后使用下面指令查看jdk版本,没问题即可:

复制代码
java -version

再次执行启动命令

复制代码
sh bin/startup.sh

查看输出日志:

启动成功!服务端启动成功!

如果启动不成功,有下面这个报错:

Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "CHARACTER VARYING

可以参考这两个Issues:

Value too long for column "CHARACTER VARYING" · Issue #5086 · alibaba/canal · GitHubI have searched the issues of this repository and believe that this is not a duplicate. I have checked the FAQ of this repository and believe that this is not a duplicate. environment ubuntu20 canal version \*1.1.8-alpha mysql version mys...\[这里是图片027\]https://github.com/alibaba/canal/issues/5086\](https://github.com/alibaba/canal/issues/5086 "Value too long for column "CHARACTER VARYING" · Issue #5086 · alibaba/canal · GitHub") [服务起来的时候 meta_snapshot 表的 data字段提示超长 · Issue #5268 · alibaba/canal · GitHubcom.alibaba.otter.canal.parse.exception.CanalParseException: apply failed caused by : nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='data', mode=IN, javaType=cla...\[这里是图片028\]https://github.com/alibaba/canal/issues/5268](https://github.com/alibaba/canal/issues/5268 "服务起来的时候 meta_snapshot 表的 data字段提示超长 · Issue #5268 · alibaba/canal · GitHub") 我两个都没能解决,自己服务器可以,实习的服务器可能公司的表太多了,导致出问题,我是通过降低版本解决的,用1.1.16。如果有大佬解决了,欢迎评论区dd。 #### 六、客户端 查看官方使用例子 ![](https://i-blog.csdnimg.cn/direct/276df47850f14148b9e1d2d5cd1b6569.png) [ClientExample · alibaba/canal Wiki · GitHub阿里巴巴 MySQL binlog 增量订阅\&消费组件 . Contribute to alibaba/canal development by creating an account on GitHub.\[这里是图片030\]https://github.com/alibaba/canal/wiki/ClientExample](https://github.com/alibaba/canal/wiki/ClientExample "ClientExample · alibaba/canal Wiki · GitHub") 引入依赖 ![](https://i-blog.csdnimg.cn/direct/479906caa309407ba8106dc59d705d8c.png) com.alibaba.otter canal.client 1.1.0 code如下: ![](https://i-blog.csdnimg.cn/direct/b5bb6cf791174100a1a934d4209251e3.png) ![](https://i-blog.csdnimg.cn/direct/c319a76d8e914e88a568359b43a04905.png) 修改后启动: ![](https://i-blog.csdnimg.cn/direct/e304f3a679394926b6452403c0029bd7.png) 然后我插入一条数据,也是监听到了。 ![](https://i-blog.csdnimg.cn/direct/2e4694f66f5e49d7a5d6ff4252cb2173.png)测试成功。 ![](https://i-blog.csdnimg.cn/direct/1b765ff7756a4a0f832ab3b927ebdec6.png) #### 七、同步ES(Sync ES) ![](https://i-blog.csdnimg.cn/direct/d8ba08c8f50b4dc0b5c54677f6ce67bb.png) ![](https://i-blog.csdnimg.cn/direct/f05ac9e5bc484098aa6bac915a7c311a.png) 将这个下载到服务器中某个位置: ![](https://i-blog.csdnimg.cn/direct/336be6def8c6454e9b39f6b625e67782.png) 然后用下面这个命令解压 tar zxvf canal.adapter-1.1.8-SNAPSHOT.tar.gz ![](https://i-blog.csdnimg.cn/direct/e5907e97f9ed4021965ed5f9ffdfa8d8.png) 还有一处配置可以参考一下下面这位大佬的博客: [canal实现MySQL和ES同步实践_canal mysql es-CSDN博客文章浏览阅读1.6k次,点赞29次,收藏20次。通过canal同步MySQL与ES数据的实操分享_canal mysql es\[这里是图片041\]https://blog.csdn.net/weixin_44517677/article/details/136856682?spm=1001.2014.3001.5506](https://blog.csdn.net/weixin_44517677/article/details/136856682spm=1001.2014.3001.5506 "canal实现MySQL和ES同步实践_canal mysql es-CSDN博客") ![](https://i-blog.csdnimg.cn/direct/eaebe595702c43e5932dd4b58cfc5716.png) 下面给出我的部分配置: ![](https://i-blog.csdnimg.cn/direct/3b67205fc678414e8a876cd9e728cb7c.png) ![](https://i-blog.csdnimg.cn/direct/ece1559e820d4025b587e3a25564bd47.png) server: port: 8081 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null canal.conf: mode: tcp #tcp kafka rocketMQ rabbitMQ flatMessage: true zookeeperHosts: syncBatchSize: 1000 retries: -1 timeout: accessKey: secretKey: consumerProperties: # canal tcp consumer canal.tcp.server.host: 127.0.0.1:11111 #记得去防火墙开启这个端口 canal.tcp.zookeeper.hosts: canal.tcp.batch.size: 500 canal.tcp.username: canal.tcp.password: # kafka consumer kafka.bootstrap.servers: 127.0.0.1:9092 kafka.enable.auto.commit: false kafka.auto.commit.interval.ms: 1000 kafka.auto.offset.reset: latest kafka.request.timeout.ms: 40000 kafka.session.timeout.ms: 30000 kafka.isolation.level: read_committed kafka.max.poll.records: 1000 # rocketMQ consumer rocketmq.namespace: rocketmq.namesrv.addr: 127.0.0.1:9876 rocketmq.batch.size: 1000 rocketmq.enable.message.trace: false rocketmq.customized.trace.topic: rocketmq.access.channel: rocketmq.subscribe.filter: # rabbitMQ consumer rabbitmq.host: rabbitmq.virtual.host: rabbitmq.username: rabbitmq.password: rabbitmq.resource.ownerId: srcDataSources: defaultDS: url: jdbc:mysql://你的服务器IP:3306/你的DataSource名?useUnicode=true&useSSL=false&serverTimezone=UTC username: canal password: canal canalAdapters: - instance: example # canal instance Name or mq topic name groups: - groupId: g1 outerAdapters: - name: logger - name: es7 hosts: http://你的服务器IP:9200 properties: mode: rest #9200端口的话就写rest cluster.name: elasticsearch ![](https://i-blog.csdnimg.cn/direct/aca105dec7e5469bb81bb1e0caff79db.png) ![](https://i-blog.csdnimg.cn/direct/888c3872e2394bef879b49f4e9c6ba67.png) datasourceKey: defaultDS #源数据源的key,对应上面配置的srcDatasources中的值 destination: example #canal的instance或者MO的topic groupId: g1 #对应MQ模式下的groupId,只会同步对应groupId的数据 esMapping: _index: user #es 的索引名称 _id: _id #es 的 id,如果不配置该项必须配置下面的pk项 id则会由es自动分配 # 下面写你的MySQL需要配置表的查询语句(完整的语句) sql: "SELECT u.id AS _id, u.id , u.openid, u.quick_user_id, u.mark_number, u.brief_introduction FROM user u;" # sq1映射 commitBatch: 500 # 提交批大小 开启服务: 1.进入对应目录 cd /tmp/canal/canal.adapter 2.启动服务 sh bin/startup.sh ![](https://i-blog.csdnimg.cn/direct/81d26b925aa7406e8b1f308f7e0bd763.png) 再去查看log日志: ![](https://i-blog.csdnimg.cn/direct/c5fb5fb8712e48c097a2b68dc5014720.png) ![](https://i-blog.csdnimg.cn/direct/25a2b36d72af4604ad58c28bd5fcc468.png) 启动成功 3.如果想要停止服务 sh bin/stop.sh 如果发现运行不起来,运行了没有log日志,可以尝试下面两种解决办法: 1、降低jdk版本 2、修改分配虚拟机启动的内存 ![](https://i-blog.csdnimg.cn/direct/c645cf1aa9b94d1dbaf372fe7cc49ad7.png) ![](https://i-blog.csdnimg.cn/direct/8112a3eece8c4c85a50d3664d317cc13.png) 可以修改为: -Xms512m -Xmx1024m #### 八、测试同步 ![](https://i-blog.csdnimg.cn/direct/06476d8143814c8296cea989945bb81c.png) 新增一条数据 ![](https://i-blog.csdnimg.cn/direct/541157f443ed4c31829025391f8aaf42.png) ![](https://i-blog.csdnimg.cn/direct/6bc7ce6371cf4bb1bcf45aa70871c5ed.png) 更新一条数据 ![](https://i-blog.csdnimg.cn/direct/0115120f977d4a029b456e5718589eee.png) ![](https://i-blog.csdnimg.cn/direct/0d61d21d258c48788990d991a02554be.png) 修改同步成功,注意上面一个配置文件中我写的查询语句并不完整,实际上是需要完整的,注意和自己表的查询语句一致,注意注意。。 #### 九、曾遇过的bug 如果出现下面这种情况,可能是修改MySQL后没有重启MySQL。。。实习的时候被这这个问题折磨了一天,搜了各种办法,很逆天。 > DEBuG c.a.0.canal.client.adapter.es,core.service.Essyncservice -ml: {"data":null,"database":"quick pickup","destination": "example","es":1732938564088,"groupId":"g1" "isDd1":false,"old":nul1,"okNames":\[1,"sal > ![](https://i-blog.csdnimg.cn/direct/7f650d818b3848e6909dbc63ef9c0fd8.png) 最后去重启了一下,结果发现成功了,成功监听到信息。 ![](https://i-blog.csdnimg.cn/direct/5f5d77e10e1a4770969b63d9cf59ab0d.png)

相关推荐
Elasticsearch1 分钟前
Elastic 获得 ISO 27701 认证
elasticsearch
Elasticsearch2 分钟前
Elastic:DevRel 通讯 — 2026 年 1 月
elasticsearch
石头53011 分钟前
Service 详解
linux
小鸡脚来咯12 分钟前
Linux 服务器问题排查指南(面试标准回答)
linux·服务器·面试
末日汐15 分钟前
磁盘与文件系统
linux·运维·数据库
水天需01022 分钟前
Linux PS4 环境变量详解
linux
小新ya32 分钟前
vscode增删改查文件,一直等待中...
linux·vscode
萧曵 丶37 分钟前
MySQL InnoDB 实现 MVCC 原理
数据库·mysql·mvcc
万粉变现经纪人1 小时前
如何解决 pip install mysqlclient 报错 ‘mysql_config’ not found 问题
数据库·python·mysql·pycharm·bug·pandas·pip
lkbhua莱克瓦241 小时前
进阶-SQL优化
java·数据库·sql·mysql·oracle