基于Canal实现MySQL 8.0 数据库数据同步
0、前置信息
0.1、服务器信息
主机名
|
操作系统
|
说明
|
---|---|---|
192.168.91.131
|
CentOS 7
|
主库所在服务器
|
192.168.91.135
|
CentOS 7
|
canal数据同步所在服务器
|
0.2、版本说明
MySQL版本:MySQL_8.0.23
Canal版本:Canal_1.1.5
0.3、安装 MySQL8.0 数据库
关于MySQL8.0数据库的安装,可参考之前的博文:https://www.cnblogs.com/cndarren/p/16161256.html
0.4、配置MySQL8.0数据库
vi /etc/my.cnf
添加如下配置,开启MySQL binlog功能
# 服务编号, 与其它节点不冲突即可
server_id=1
log_bin=binlog
binlog_format=ROW
0.5、Canal简介
关于canal简介,这里就不再阐述,具体可以参看官方文档介绍,地址如下:
https://github.com/alibaba/canal/wiki/%E7%AE%80%E4%BB%8B
1、主库服务器操作
1.1、连接主库所在服务器
# 连接主库所在服务器,即:192.168.91.131, 切换 root 账号
su root
1.2、启动MySQL8.0数据库
systemctl start mysqld.service
1.3、创建复制账号和密码
连接主库所在服务器,即:192.168.91.131,运行MySQL 8.0数据库,创建复制账号和密码,命令如下:
mysql> CREATE USER canal IDENTIFIED BY 'canal';
mysql> GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
mysql> FLUSH PRIVILEGES;
2、canal数据同步服务器操作
2.1、创建canal文件夹
cd /usr/local
mkdir canal
cd canal
mkdir canal-package canal-adapter canal-deployer
2.2、安装canal deployer和canal adapter
cd canal-package
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
ls
tar -zxvf canal.adapter-1.1.5.tar.gz -C /usr/local/canal/canal-adapter
tar -zxvf canal.deployer-1.1.5.tar.gz -C /usr/local/canal/canal-deployer
2.3、配置和启动canal-deployer
2.3.1、配置canal-deployer
由于此次同步为MySQL数据库间的数据同步,所以此处不需要修改 canal.properties 配置文件,只需修改 instance.properties 即可
cd /usr/local/canal/canal-deployer/conf/example
vi instance.properties
修改内容如下图所示:
说明:instance.properties中同步数据表默认为同步数据库下所有的表信息,具体配置如下:
若需要同步某几张表,可以参考如下配置:
# 同步某数据库test1下的user表,test2数据库下的所有表,所有库下所有表数据
canal.instance.filter.regex=test1.user,test2\\..*,.*\\..*
2.3.2、启动canal-deployer
cd /usr/local/canal/canal-deployer/bin
./startup.sh
查看日志确定是否启动成功
cd /usr/local/canal/canal-deployer/logs/example
cat example.log
可能遇到的问题:
canal-deployer启动之后,如果在 logs 文件夹下没有 example 文件,参考如下情况说明:
1、查看 /usr/local/canal/canal-deployer/bin 文件夹下,是否存在以hs_err_pid开头的文件。
# 出现hs_err_pid开头的文件,主要原因有两个:
1> 服务器内存不足,导致服务启动失败,出现OOM问题,这时需要增加服务器内存
2> 服务器打开的线程数达到上限,这时需要修改线程上限,操作如下:
vi /etc/security/limits.conf
修改内容可参考下面配置:
* soft nproc 102400
* hard nofile 102400
# 上述配置参数说明:
第一列:linux系统用户名,*代表所有用户
第二列:软连接/硬连接
第三列:类型,nproc 进程的数量/nofile 文件打开数/core-core 文件大小
第四列:数量
2、bin文件夹下不存在以hs_err_pid开头的文件,查看logs文件夹下的canal文件夹下的canal_stdout.log文件,命令如下:
cat /usr/local/canal/canal-deployer/logs/canal/canal_stdout.log
若出现如下报错信息:
OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
解决方案:
出现此报错的原因是由于当前服务器安装的jdk版本高于jdk8,此时需要修改 startup.sh 的启动参数,操作如下:
cd /usr/local/canal/canal-deployer/bin
./stop.sh
vi startup.sh
# 找到下图所展示位置,删除 -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods 参数
./startup.sh
2.4、配置和启动canal-adapter
2.4.1、配置canal-adapter
1> 修改application.yml文件
cd /usr/local/canal/canal-adapter/conf
vi application.yml
添加配置如下:
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
flatMessage: true
zookeeperHosts:
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
consumerProperties:
# canal tcp consumer
# 修改位置:Canal deployer所在主机IP
canal.tcp.server.host: 192.168.91.135: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://192.168.91.131:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
username: root
password: 123456
amsDS:
url: jdbc:mysql://192.168.91.131:3306/nms?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
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.91.135:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
jdbc.username: root
jdbc.password: 123456
- name: rdb
key: mysql2
properties:
jdbc.driverClassName: com.mysql.jdbc.Driver
jdbc.url: jdbc:mysql://192.168.91.135:3306/nms?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
jdbc.username: root
jdbc.password: 123456
# - name: rdb
# key: oracle1
# properties:
# jdbc.driverClassName: oracle.jdbc.OracleDriver
# jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
# jdbc.username: mytest
# jdbc.password: m121212
# - name: rdb
# key: postgres1
# properties:
# jdbc.driverClassName: org.postgresql.Driver
# jdbc.url: jdbc:postgresql://localhost:5432/postgres
# jdbc.username: postgres
# jdbc.password: 121212
# threads: 1
# commitSize: 3000
# - name: hbase
# properties:
# hbase.zookeeper.quorum: 127.0.0.1
# hbase.zookeeper.property.clientPort: 2181
# zookeeper.znode.parent: /hbase
# - name: es
# hosts: 127.0.0.1:9300 # 127.0.0.1:9200 for rest mode
# properties:
# mode: transport # or rest
# # security.auth: test:123456 # only used for rest mode
# cluster.name: elasticsearch
# - name: kudu
# key: kudu
# properties:
# kudu.master.address: 127.0.0.1 # ',' split multi address
说明:
i、其中 outAdapter 的配置: name统一为rdb, key为对应的数据源的唯一标识需和下面的表映射文件中的outerAdapterKey对应, properties为目标库jdbc的相关参数
ii、adapter将会自动加载 conf/rdb 下的所有.yml结尾的表映射配置文件
2> 修改canal-adapter/conf/rdb
文件夹下的yml文件
说明:canal-adapter/conf/rdb
文件夹下的yml文件可以同步数据库下的一张表,也可以同步数据库下的所有表(此处的前提是:同步数据的数据库与主库的schema一致)
(1)同步数据库下的某张表,例如同步test数据库下的user表,操作如下:
cd /usr/local/canal/canal-adapter/conf/rdb
cp mytest_user.yml test_user.yml
rm -rf mytest_user.yml
vi test_user.yml
配置信息如下:
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值 destination: example # cannal的instance或者MQ的topic groupId: g1 # 对应MQ模式下的groupId, 只会同步对应groupId的数据 outerAdapterKey: mysql1 # adapter key, 对应上面配置outAdapters中的key concurrent: true # 是否按主键hash并行同步, 并行同步的表必须保证主键不会更改及主键不能为其他同步表的外键! dbMapping: database: test # 源数据源的database/schema table: user # 源数据源表名 targetTable: test.user # 目标数据源的库名.表名 targetPk: # 主键映射 id: id # 如果是复合主键可以换行映射多个 mapAll: true # 是否整表映射, 要求源表和目标表字段名一模一样 (如果targetColumns也配置了映射, 则以targetColumns配置为准) #targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填 # id: # name: # role_id: # c_time: # test1:
(2)同步数据库下所有表数据,例如:同步test数据库下所有表数据,操作如下:
cd /usr/local/canal/canal-adapter/conf/rdb
cp mytest_user.yml test_user.yml
rm -rf mytest_user.yml
vi test_user.yml
配置如下:
## Mirror schema synchronize config
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
mirrorDb: true
database: test
2.4.2、启动canal-adapter
cd /usr/local/canal/canal-adapter/bin
./startup.sh
查看日志信息,确保正常启动。
cd /usr/local/canal/canal-adapter/logs/adapter
cat adapter.log
3、连接数据库管理工具测试
在主库(192.168.91.131)test数据库下的user表中插入数据,查看canal所在数据库test下的user表中是否同步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix