Canal介绍
Canal简介

canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。
基于日志增量订阅和消费的业务包括
- 数据库镜像
- 数据库实时备份
- 索引构建和实时维护(拆分异构索引、倒排索引等)
- 业务 cache 刷新
- 带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x
MySQL工作原理

- MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
- MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
- MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
Canal工作原理

- canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
- MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
- canal 解析 binary log 对象(原始为 byte 流)
Canal使用准备
MySQL准备
1、对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下
2、授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grant
3、重启数据库,查看配置是否生效
Canal使用准备
Canal下载,这里使用1.1.5版本为例
github链接:https://github.com/alibaba/canal/releases
需要下载(其他可根据自行需要进行下载):
- canal.deployer-1.1.5.tar.gz
- canal.adapter-1.1.5.tar.gz
下载后解压
1.1.5解压后目录结构如下
创建数据库和表
踩坑记录:数据库名不要使用下划线,一开始用canal_test_01的方式命名,发现扫描不到数据库
Canal-deployer使用
1、conf\canal.properties配置文件(这里只介绍我用到的配置)
2、conf\example\instance.properties配置文件(这里只介绍我用到的配置)
3、检查lib目录下的jar包,一定要有对应的数据库驱动包,且版本要对得上
4、在bin目录中启动canal-deployer,启动成功如下输出
5、创建springboot工程监听canal-deployer(可跳过)
导入maven坐标(pom.xml)
创建CanalClient类,并交给spring管理
启动springboot项目,在user01表中添加数据,控制台如下输出,监听成功
Canal-adapter使用
1、conf\application.yml配置文件(这里只介绍我用到的配置)
2、配置RDB表映射文件(conf/rdb/mytest_user.yml文件)
3、检查lib目录下的jar包,一定要有对应的数据库驱动包,且版本要对得上
4、在bin目录中启动canal-adapter,启动成功如下输出
2021-04-28 11:12:38.281 [main] INFO o.s.b.w.s.c.AnnotationConfigServletWebServe rApplicationContext - Refreshing org.springframework.boot.web.servlet.context.An notationConfigServletWebServerApplicationContext@2ef14fe: startup date [Wed Apr 28 11:12:38 CST 2021]; parent: org.springframework.context.annotation.Annotation ConfigApplicationContext@1a677343 2021-04-28 11:12:39.012 [main] INFO org.springframework.cloud.context.scope.Gen ericScope - BeanFactory id=ba9c0aec-0105-3f1f-b89e-e85c68567039 2021-04-28 11:12:39.108 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$B eanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.Configur ationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.aut oconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGL IB$$60a96eee] is not eligible for getting processed by all BeanPostProcessors (f or example: not eligible for auto-proxying) 2021-04-28 11:12:39.610 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServe r - Tomcat initialized with port(s): 8081 (http) 2021-04-28 11:12:39.632 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] 2021-04-28 11:12:39.646 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] 2021-04-28 11:12:39.647 [main] INFO org.apache.catalina.core.StandardEngine - S tarting Servlet Engine: Apache Tomcat/8.5.29 2021-04-28 11:12:39.660 [localhost-startStop-1] INFO org.apache.catalina.core.A prLifecycleListener - The APR based Apache Tomcat Native library which allows op timal performance in production environments was not found on the java.library.p ath: [C:\ProgramData\Oracle\Java\javapath;C:\Windows\Sun\Java\bin;C:\Windows\sys tem32;C:\Windows;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Wind ows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Java \jdk1.8.0_131\bin;C:\Java\jdk1.8.0_131\jre\bin;D:\Tools\JAVA\apache-maven-3.6.3\ bin;C:\Program Files\Git\cmd;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Com mon;C:\go\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Yarn\bin\;;C:\User s\Administrator\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\Je tBrains\WebStorm 2019.3.1\bin;;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4 \bin;;C:\Users\Administrator\go\bin;C:\Users\Administrator\AppData\Roaming\npm;C :\Users\Administrator\AppData\Local\Yarn\bin;D:\Tools\zookeeper-3.4.13\bin;;.] 2021-04-28 11:12:39.830 [localhost-startStop-1] INFO o.a.catalina.core.Containe rBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationCont ext 2021-04-28 11:12:39.831 [localhost-startStop-1] INFO org.springframework.web.co ntext.ContextLoader - Root WebApplicationContext: initialization completed in 15 50 ms 2021-04-28 11:12:39.990 [localhost-startStop-1] INFO o.s.boot.web.servlet.Servl etRegistrationBean - Servlet dispatcherServlet mapped to [/] 2021-04-28 11:12:40.000 [localhost-startStop-1] INFO o.s.boot.web.servlet.Filte rRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*] 2021-04-28 11:12:40.000 [localhost-startStop-1] INFO o.s.boot.web.servlet.Filte rRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2021-04-28 11:12:40.001 [localhost-startStop-1] INFO o.s.boot.web.servlet.Filte rRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*] 2021-04-28 11:12:40.002 [localhost-startStop-1] INFO o.s.boot.web.servlet.Filte rRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*] Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SP I and manual loading of the driver class is generally unnecessary. 2021-04-28 11:12:40.597 [main] INFO com.alibaba.druid.pool.DruidDataSource - {d ataSource-1} inited 2021-04-28 11:12:40.849 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMap ping - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springf ramework.web.servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.143 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerAdapter - Looking for @ControllerAdvice: org.springframework.boot.web.serv let.context.AnnotationConfigServletWebServerApplicationContext@2ef14fe: startup date [Wed Apr 28 11:12:38 GMT+08:00 2021]; parent: org.springframework.context.a nnotation.AnnotationConfigApplicationContext@1a677343 2021-04-28 11:12:41.245 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/count/{type}/{key}/{task}],methods=[GET]}" onto publi c java.util.Map<java.lang.String, java.lang.Object> com.alibaba.otter.canal.adap ter.launcher.rest.CommonRest.count(java.lang.String,java.lang.String,java.lang.S tring) 2021-04-28 11:12:41.247 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/count/{type}/{task}],methods=[GET]}" onto public java .util.Map<java.lang.String, java.lang.Object> com.alibaba.otter.canal.adapter.la uncher.rest.CommonRest.count(java.lang.String,java.lang.String) 2021-04-28 11:12:41.248 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/syncSwitch/{destination}/{status}],methods=[PUT]}" on to public com.alibaba.otter.canal.client.adapter.support.Result com.alibaba.otte r.canal.adapter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String) 2021-04-28 11:12:41.249 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/syncSwitch/{destination}],methods=[GET]}" onto public java.util.Map<java.lang.String, java.lang.String> com.alibaba.otter.canal.adapt er.launcher.rest.CommonRest.etl(java.lang.String) 2021-04-28 11:12:41.249 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/etl/{type}/{key}/{task}],methods=[POST]}" onto public com.alibaba.otter.canal.client.adapter.support.EtlResult com.alibaba.otter.cana l.adapter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String,java.la ng.String,java.lang.String) 2021-04-28 11:12:41.250 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/etl/{type}/{task}],methods=[POST]}" onto public com.a libaba.otter.canal.client.adapter.support.EtlResult com.alibaba.otter.canal.adap ter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String,java.lang.Str ing) 2021-04-28 11:12:41.251 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/destinations],methods=[GET]}" onto public java.util.L ist<java.util.Map<java.lang.String, java.lang.String>> com.alibaba.otter.canal.a dapter.launcher.rest.CommonRest.destinations() 2021-04-28 11:12:41.256 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/error]}" onto public org.springframework.http.Respons eEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.b oot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.htt p.HttpServletRequest) 2021-04-28 11:12:41.258 [main] INFO o.s.w.s.m.method.annotation.RequestMappingH andlerMapping - Mapped "{[/error],produces=[text/html]}" onto public org.springf ramework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.ser vlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 2021-04-28 11:12:41.298 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMap ping - Mapped URL path [/webjars/**] onto handler of type [class org.springframe work.web.servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.299 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMap ping - Mapped URL path [/**] onto handler of type [class org.springframework.web .servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.604 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Registering beans for JMX exposure on startup 2021-04-28 11:12:41.618 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Bean with name 'refreshScope' has been autodetected for JMX exposure 2021-04-28 11:12:41.620 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Bean with name 'configurationPropertiesRebinder' has been autodetected for JMX exposure 2021-04-28 11:12:41.622 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Bean with name 'environmentManager' has been autodetected for JMX expos ure 2021-04-28 11:12:41.625 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Located managed bean 'environmentManager': registering with JMX server as MBean [org.springframework.cloud.context.environment:name=environmentManager, type=EnvironmentManager] 2021-04-28 11:12:41.644 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Located managed bean 'refreshScope': registering with JMX server as MBe an [org.springframework.cloud.context.scope.refresh:name=refreshScope,type=Refre shScope] 2021-04-28 11:12:41.659 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanEx porter - Located managed bean 'configurationPropertiesRebinder': registering wit h JMX server as MBean [org.springframework.cloud.context.properties:name=configu rationPropertiesRebinder,context=2ef14fe,type=ConfigurationPropertiesRebinder] 2021-04-28 11:12:41.675 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAd apterService - 2021-04-28 11:12:41.675 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAd apterService - 2021-04-28 11:12:41.678 [main] INFO c.a.otter.canal.client.adapter.support.Exte nsi"hljs-string">D:\Darren\source\FoodMS\FoodMS-Docs\Tools \Canal\canal.adapter-1.1.5\canal.adapter-1.1.5\plugin 2021-04-28 11:12:41.777 [main] INFO c.a.otter.canal.client.adapter.rdb.config.C onfigLoader - 2021-04-28 11:12:41.837 [main] INFO c.a.otter.canal.client.adapter.rdb.config.C onfigLoader - 2021-04-28 11:12:42.224 [main] INFO com.alibaba.druid.pool.DruidDataSource - {d ataSource-2} inited 2021-04-28 11:12:42.234 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAd apterLoader - Load canal adapter: rdb succeed 2021-04-28 11:12:42.246 [main] INFO c.alibaba.otter.canal.connector.core.spi.Ex tensi"hljs-string">D:\Darren\source\FoodMS\FoodMS-Docs\Too ls\Canal\canal.adapter-1.1.5\canal.adapter-1.1.5\plugin 2021-04-28 11:12:42.275 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAd apterLoader - Start adapter for canal-client mq topic: example-g1 succeed 2021-04-28 11:12:42.276 [Thread-4] INFO c.a.otter.canal.adapter.launcher.loader .AdapterProcessor - =============> Start to connect destination: example <====== ======= 2021-04-28 11:12:42.276 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAd apterService - 2021-04-28 11:12:42.286 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] 2021-04-28 11:12:42.296 [main] INFO org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read 2021-04-28 11:12:42.316 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServe r - Tomcat started on port(s): 8081 (http) with context path '' 2021-04-28 11:12:42.320 [main] INFO c.a.otter.canal.adapter.launcher.CanalAdapt erApplication - Started CanalAdapterApplication in 5.287 seconds (JVM running fo r 6.186) 2021-04-28 11:12:42.354 [Thread-4] INFO c.a.otter.canal.adapter.launcher.loader .AdapterProcessor - =============> Subscribe destination: example succeed <===== ======== 2021-04-28 11:12:37.612 [main] INFO o.s.c.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1a677343: startup date [Wed Apr 28 11:12:37 CST 2021]; root of context hierarchy 2021-04-28 11:12:38.027 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'configurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$60a96eee] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2021-04-28 11:12:38.254 [main] INFO c.a.otter.canal.adapter.launcher.CanalAdapterApplication - No active profile set, falling back to default profiles: default 2021-04-28 11:12:38.281 [main] INFO o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2ef14fe: startup date [Wed Apr 28 11:12:38 CST 2021]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@1a677343 2021-04-28 11:12:39.012 [main] INFO org.springframework.cloud.context.scope.GenericScope - BeanFactory id=ba9c0aec-0105-3f1f-b89e-e85c68567039 2021-04-28 11:12:39.108 [main] INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$60a96eee] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2021-04-28 11:12:39.610 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8081 (http) 2021-04-28 11:12:39.632 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8081"] 2021-04-28 11:12:39.646 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat] 2021-04-28 11:12:39.647 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/8.5.29 2021-04-28 11:12:39.660 [localhost-startStop-1] INFO org.apache.catalina.core.AprLifecycleListener - The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\ProgramData\Oracle\Java\javapath;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Java\jdk1.8.0_131\bin;C:\Java\jdk1.8.0_131\jre\bin;D:\Tools\JAVA\apache-maven-3.6.3\bin;C:\Program Files\Git\cmd;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\go\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Yarn\bin\;;C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\bin;C:\Program Files\JetBrains\WebStorm 2019.3.1\bin;;C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.4\bin;;C:\Users\Administrator\go\bin;C:\Users\Administrator\AppData\Roaming\npm;C:\Users\Administrator\AppData\Local\Yarn\bin;D:\Tools\zookeeper-3.4.13\bin;;.] 2021-04-28 11:12:39.830 [localhost-startStop-1] INFO o.a.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext 2021-04-28 11:12:39.831 [localhost-startStop-1] INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 1550 ms 2021-04-28 11:12:39.990 [localhost-startStop-1] INFO o.s.boot.web.servlet.ServletRegistrationBean - Servlet dispatcherServlet mapped to [/] 2021-04-28 11:12:40.000 [localhost-startStop-1] INFO o.s.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'characterEncodingFilter' to: [/*] 2021-04-28 11:12:40.000 [localhost-startStop-1] INFO o.s.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2021-04-28 11:12:40.001 [localhost-startStop-1] INFO o.s.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'httpPutFormContentFilter' to: [/*] 2021-04-28 11:12:40.002 [localhost-startStop-1] INFO o.s.boot.web.servlet.FilterRegistrationBean - Mapping filter: 'requestContextFilter' to: [/*] 2021-04-28 11:12:40.597 [main] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-1} inited 2021-04-28 11:12:40.849 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.143 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerAdapter - Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@2ef14fe: startup date [Wed Apr 28 11:12:38 GMT+08:00 2021]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@1a677343 2021-04-28 11:12:41.245 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/count/{type}/{key}/{task}],methods=[GET]}" onto public java.util.Map<java.lang.String, java.lang.Object> com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.count(java.lang.String,java.lang.String,java.lang.String) 2021-04-28 11:12:41.247 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/count/{type}/{task}],methods=[GET]}" onto public java.util.Map<java.lang.String, java.lang.Object> com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.count(java.lang.String,java.lang.String) 2021-04-28 11:12:41.248 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/syncSwitch/{destination}/{status}],methods=[PUT]}" onto public com.alibaba.otter.canal.client.adapter.support.Result com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String) 2021-04-28 11:12:41.249 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/syncSwitch/{destination}],methods=[GET]}" onto public java.util.Map<java.lang.String, java.lang.String> com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.etl(java.lang.String) 2021-04-28 11:12:41.249 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/etl/{type}/{key}/{task}],methods=[POST]}" onto public com.alibaba.otter.canal.client.adapter.support.EtlResult com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String,java.lang.String,java.lang.String) 2021-04-28 11:12:41.250 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/etl/{type}/{task}],methods=[POST]}" onto public com.alibaba.otter.canal.client.adapter.support.EtlResult com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.etl(java.lang.String,java.lang.String,java.lang.String) 2021-04-28 11:12:41.251 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/destinations],methods=[GET]}" onto public java.util.List<java.util.Map<java.lang.String, java.lang.String>> com.alibaba.otter.canal.adapter.launcher.rest.CommonRest.destinations() 2021-04-28 11:12:41.256 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2021-04-28 11:12:41.258 [main] INFO o.s.w.s.m.method.annotation.RequestMappingHandlerMapping - Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2021-04-28 11:12:41.298 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.299 [main] INFO o.s.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2021-04-28 11:12:41.604 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Registering beans for JMX exposure on startup 2021-04-28 11:12:41.618 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Bean with name 'refreshScope' has been autodetected for JMX exposure 2021-04-28 11:12:41.620 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Bean with name 'configurationPropertiesRebinder' has been autodetected for JMX exposure 2021-04-28 11:12:41.622 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Bean with name 'environmentManager' has been autodetected for JMX exposure 2021-04-28 11:12:41.625 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Located managed bean 'environmentManager': registering with JMX server as MBean [org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager] 2021-04-28 11:12:41.644 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Located managed bean 'refreshScope': registering with JMX server as MBean [org.springframework.cloud.context.scope.refresh:name=refreshScope,type=RefreshScope] 2021-04-28 11:12:41.659 [main] INFO o.s.jmx.export.annotation.AnnotationMBeanExporter - Located managed bean 'configurationPropertiesRebinder': registering with JMX server as MBean [org.springframework.cloud.context.properties:name=configurationPropertiesRebinder,context=2ef14fe,type=ConfigurationPropertiesRebinder] 2021-04-28 11:12:41.675 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterService - 2021-04-28 11:12:41.675 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterService - 2021-04-28 11:12:41.678 [main] INFO c.a.otter.canal.client.adapter.support.Extensi"hljs-string">D:\Darren\source\FoodMS\FoodMS-Docs\Tools\Canal\canal.adapter-1.1.5\canal.adapter-1.1.5\plugin 2021-04-28 11:12:41.777 [main] INFO c.a.otter.canal.client.adapter.rdb.config.ConfigLoader - 2021-04-28 11:12:41.837 [main] INFO c.a.otter.canal.client.adapter.rdb.config.ConfigLoader - 2021-04-28 11:12:42.224 [main] INFO com.alibaba.druid.pool.DruidDataSource - {dataSource-2} inited 2021-04-28 11:12:42.234 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Load canal adapter: rdb succeed 2021-04-28 11:12:42.246 [main] INFO c.alibaba.otter.canal.connector.core.spi.Extensi"hljs-string">D:\Darren\source\FoodMS\FoodMS-Docs\Tools\Canal\canal.adapter-1.1.5\canal.adapter-1.1.5\plugin 2021-04-28 11:12:42.275 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterLoader - Start adapter for canal-client mq topic: example-g1 succeed 2021-04-28 11:12:42.276 [Thread-4] INFO c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - =============> Start to connect destination: example <============= 2021-04-28 11:12:42.276 [main] INFO c.a.o.canal.adapter.launcher.loader.CanalAdapterService - 2021-04-28 11:12:42.286 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8081"] 2021-04-28 11:12:42.296 [main] INFO org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read 2021-04-28 11:12:42.316 [main] INFO o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8081 (http) with context path '' 2021-04-28 11:12:42.320 [main] INFO c.a.otter.canal.adapter.launcher.CanalAdapterApplication - Started CanalAdapterApplication in 5.287 seconds (JVM running for 6.186) 2021-04-28 11:12:42.354 [Thread-4] INFO c.a.otter.canal.adapter.launcher.loader.AdapterProcessor - =============> Subscribe destination: example succeed <=============
5、向user01表中添加数据,user02表也有对应数据,同步成功
如需user02同步到user01:
(1)添加对应的canal-deployer中添加对应的example
(2)canal-adapter的application.yml配置文件中加入对应的源数据库和目标数据库(具体见上面配置)
(3)新建RDB表映射文件,在rdb目录下,canal-adapter会默认扫描rdb目录下所有的yml文件
同步多张表:
(1)在两个数据库中增加表(这里以person为例)
(2)配置RDB表映射文件,将mytest_user.yml复制一份,重命名为mytest_person.yml
(3)修改mytest_person.yml中的table(源表)、targetTable(目标表)
6、如果需要使用Java工程,可自行在github的canal中下载canal-adapter的工程,配置与上面完全一样
注意:本文归作者所有,未经作者允许,不得转载