修改涉及的文件
- deployer
/conf/canal.properties
/conf/example/instance.properties
- canal-adapter
/conf/application.yml
/conf/rdb
添加对应的数据表配置 - 只监听一个数据源只需要配置一个example
- 监听多个数据源相应的配置多个example(复制后修改)
前置准备
我这里部署了三台服务器 ,两台监听的数据源 , 一台同步的数据库 。
如果使用虚拟机测试, 可以创建一台服务器,使用docker 创建mysql, 安装完jdk后, 复制两个服务器,启动进行测试
我使用的石virtualbox虚拟机
下载
- canal- --github下载地址 速度较慢
- canal----码云下载地址 速度较快
- 启动的服务器的安装好jdk 这里我安装的jdk11 需要修改startup.sh 文件
打包
项目刷新完毕 打包 生成部署文件
mvn clean install -DskipTests
打包完成后 文件地址
- deployer 在
deploy
模块target
文件的下 把canal
文件夹 重命名 压缩即可 - 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
- 修改
/conf/canal.properties
文件
添加多个实例
canal.destinations = example,example1
- 监听一个数据源 对应一个example 这里需要跟上面的对应
修改添加 example
这里我的是下面两个 名字都行 需要跟上面添加的相对应conf/example
conf/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
- 修改
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
后台管理设置
- 无法启动
- 启动后开放端口号
待办 写入测试
windows 错误
解决canal在window环境下运行出现config dir not found 的问题
把startup.bat 用记事本或者其他工具打开,将classpath用分号隔开的两个值调换一下顺序,即可解决
修改为如下
set CLASSPATH=%CLASSPATH%;%conf_dir%\..\lib\*