修改涉及的文件

  1. deployer
    /conf/canal.properties/conf/example/instance.properties
  2. canal-adapter
    /conf/application.yml/conf/rdb 添加对应的数据表配置
  3. 只监听一个数据源只需要配置一个example
  4. 监听多个数据源相应的配置多个example(复制后修改)

前置准备

我这里部署了三台服务器 ,两台监听的数据源 , 一台同步的数据库 。
如果使用虚拟机测试, 可以创建一台服务器,使用docker 创建mysql, 安装完jdk后, 复制两个服务器,启动进行测试
我使用的石virtualbox虚拟机

下载

  1. canal- --github下载地址 速度较慢
  2. canal----码云下载地址 速度较快
  3. 启动的服务器的安装好jdk 这里我安装的jdk11 需要修改startup.sh 文件

打包

项目刷新完毕 打包 生成部署文件

mvn clean install -DskipTests

打包完成后 文件地址

  1. deployer 在 deploy 模块 target 文件的下 把 canal 文件夹 重命名 压缩即可
  2. adapter 在 client-adapter 模块的 launcher 模块 target文件 对应的文件夹下 压缩即可

上传文件至服务器

将文件压缩成zip文件 上传至服务器 修改命令

chmod u+x startup.sh stop.sh restart.sh

sed -i 's/\r$//' startup.sh stop.sh restart.sh

修改 startup.sh 文件

jdk11 需要把sh文件修改 将以下相同的替换
vim startup.sh

if [ -n "$str" ]; then
	JAVA_OPTS="-server -Xms2048m -Xmx3072m -Xmn1024m -XX:SurvivorRatio=2 -Xss256k"
else
	JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m"
fi

文件配置

启动前 进行服务的文件配置

监听一个数据源同步到一个数据库

deployer

修改 /conf/example/instance.properties 文件

# 监听的数据库地址  修改成自己的
canal.instance.master.address=192.168.31.119:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
# 监听的数据库账号密码
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
#canal.instance.filter.regex=.*\\..*
# 配置监听的数据库 数据表  监听几个 配置几个 
canal.instance.filter.regex=db01.t_test1
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
# 配置消息主题
canal.mq.topic=example

canal-adapter

修改 application.yml 文件

srcDataSources:
    defaultDS:
    # 监听的数据库地址
      url: jdbc:mysql://192.168.31.119:3306/db01?useUnicode=true
      username: root
      password: 123456
  canalAdapters:
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: rdb
        key: mysql1
        properties:
        # 同步的数据库地址
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://192.168.31.208:3306/db01?useUnicode=true
          jdbc.username: root
          jdbc.password: 123456

添加对应的数据表文件 赋值一个 进行修改
数据表.yml

# 同application 的监听配置
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
 # 监听的数据库名
  database: db01
  # 监听的数据表明
  table: t_test1
  # 同步的数据表明
  targetTable: t_test1
  targetPk:
    id: id
  mapAll: true

监听多个数据源同步到到一个/多个数据库

deployer

  1. 修改 /conf/canal.properties 文件
    添加多个实例
canal.destinations = example,example1
  1. 监听一个数据源 对应一个example 这里需要跟上面的对应

修改添加 example
这里我的是下面两个 名字都行 需要跟上面添加的相对应
conf/exampleconf/example1

复制修改 对应的 instance.properties

监听的数据源1配置

# 监听的数据库地址  修改成自己的
canal.instance.master.address=192.168.31.119:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
# 监听的数据库账号密码
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
#canal.instance.filter.regex=.*\\..*
# 配置监听的数据库 数据表   这里后面跟 adapter 添加的yml对应
canal.instance.filter.regex=db01.t_test1
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
# 配置消息主题   这里跟adapter 的application.yml 对应
canal.mq.topic=example

监听的数据源2配置

# 监听的数据库地址  修改成自己的
canal.instance.master.address=192.168.31.221:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
# 监听的数据库账号密码
canal.instance.dbUsername=root
canal.instance.dbPassword=123456
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
#canal.instance.filter.regex=.*\\..*
# 配置监听的数据库 数据表  这里后面跟 adapter 添加的yml对应
canal.instance.filter.regex=db02.t_student
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
# 配置消息主题  这里跟adapter 的application.yml 对应
canal.mq.topic=example1

adapter

  1. 修改 application.yml 添加多个监听实例
srcDataSources:
	# 监听的数据源1  同example配置
    defaultDS:
      url: jdbc:mysql://192.168.31.119:3306/db01?useUnicode=true
      username: root
      password: 123456
	# 监听的数据源2 同example1的配置
    db02DS:
      url: jdbc:mysql://192.168.31.221:3306/db02?useUnicode=true
      username: root
      password: 123456
  canalAdapters:
  # example 配置 同步的数据库  这里 我同步到一个数据库 所以下面两个配置数据库一样
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: rdb
        key: mysql1
        properties:
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://192.168.31.208:3306/db01?useUnicode=true
          jdbc.username: root
          jdbc.password: 123456
    # 同 deployer example1 同步到下面配置的数据库      
  - instance: example1 # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: rdb
        key: mysql1
        properties:
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://192.168.31.208:3306/db01?useUnicode=true
          jdbc.username: root
          jdbc.password: 123456

数据表配置
添加需要同步的数据表 yml文件 复制修改

dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
 # 监听的数据库名
  database: db01
  # 监听的数据表明
  table: t_test1
  # 同步的数据表明
  targetTable: t_test1
  targetPk:
    id: id
  mapAll: true
# 上面监听的第二个数据源配置
dataSourceKey: db02DS
#  对应example1
destination: example1
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  database: db02
  table: t_student
  targetTable: t_student
  targetPk:
    id: id
  mapAll: true

问题

Reason: Unable to set value for property src-data-sources

解决方式

数据库配置改为配置

jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false

后台管理设置

  1. 无法启动
  2. 启动后开放端口号

待办 写入测试


windows 错误

解决canal在window环境下运行出现config dir not found 的问题 把startup.bat 用记事本或者其他工具打开,将classpath用分号隔开的两个值调换一下顺序,即可解决

修改为如下

set CLASSPATH=%CLASSPATH%;%conf_dir%\..\lib\*