基于Canal实现MySQL 8.0 数据库数据同步
前言
服务器说明
| 主机名称 | 操作系统 | 说明 |
|---|---|---|
| 192.168.11.82 | Ubuntu 22.04 | 主库所在服务器 |
| 192.168.11.28 | Oracle Linux Server 8.7 | 从库所在服务器 |
版本说明
MySQL版本:MySQL_8.0.32
Canal版本:Canal_1.1.7
//我的canal安装部署在192.168.11.82上,当然你也可以部署在其它的服务器上
Java版本:1.8.0.362
配置MySQL8.0数据库
修改MySQL配置文件
1、Ubuntu系统下MySQL配置文件位置
cd /etc/mysql/mysql.conf.d
vi mysqld.cnf
2、CentOS系统下MySQL配置文件位置
vi /etc/my.cnf
3、添加如下配置,开启MySQL binlog功能
# 服务编号, 与其它节点不冲突即可
server_id=1
log_bin=binlog
binlog_format=ROW
Canal简介
关于canal简介,这里就不再阐述,具体可以参看官方文档介绍,地址如下:
https://github.com/alibaba/canal/wiki/简介
主库服务器操作
启动MySQL8.0数据库
systemctl start mysql 或者
systemctl start mysqld.service
Ubuntu 使用前者

创建账号密码
mysql> CREATE USER canal IDENTIFIED BY 'canal';
mysql> GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
mysql> FLUSH PRIVILEGES;
canal数据同步服务器操作
创建canal文件夹
cd /usr/local
mkdir canal
cd canal
mkdir canal-package canal-adapter canal-deployer
安装canal deployer和canal adapter
官网下载地址
https://github.com/alibaba/canal/releases/tag/canal-1.1.7-alpha-2

只需要下载标红框的两个文件即可。复制到canal-package文件夹下。
解压
tar -zxvf canal.adapter-1.1.7-SNAPSHOT.tar.gz -C /usr/local/canal/canal-adapter
tar -zxvf canal.deployer-1.1.7-SNAPSHOT.tar.gz -C /usr/local/canal/canal-deployer
配置和启动canal-deployer
配置canal-deployer
由于此次同步为MySQL数据库间的数据同步,所以只需修改 instance.properties 即可。
cd /usr/local/canal/canal-deployer/conf/example
vi instance.properties
修改内容如下:

# 修改说明
第一个框:主库所在服务器IP
第二个框:主库数据库账号密码
第三个框:规则如下:
instance.properties中同步数据表默认为同步数据库下所有的表信息,具体配置如图第三个框:
# 若需要同步某几张表,可以参考如下配置:
# 同步某数据库test1下的user表,test2数据库下的所有表,所有库下所有表数据
canal.instance.filter.regex=test1.user,test2\\..*,.*\\..*
启动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 文件夹下,是否存在.pid的文件。
2、查看logs文件夹下的canal文件夹下的canal_stdout.log文件,命令如下:
cat /usr/local/canal/canal-deployer/logs/canal/canal_stdout.log
若出现如下信息:

解决方案:(在此强烈建议系统中只安装jdk8或者jdk11,切不可采用jenv管理jdk,安装多个版本)
cd /usr/local/canal/canal-deployer/bin
./stop.sh
vi startup.sh
# 删除报错信息包含的参数(该错误信息可能会出现多次,出现哪个删除哪个即可)
./startup.sh
重新启动:
cd /usr/local/canal/canal-deployer/bin
./startup.sh
直到出现以下信息:
# 打开日志文件
cat /usr/local/canal/canal-deployer/logs/example/example.log
# 出现以下信息说明canal-deployer启动成功
[destination = example , address = /192.168.11.82:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=binlog.000040,position=65224673,serverId=1,gtid=,timestamp=1682062760000] cost : 1331ms , the next step is binlog dump
配置canal-adapter
修改配置文件
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 #tcp kafka rocketMQ rabbitMQ
flatMessage: true
zookeeperHosts:
syncBatchSize: 1000
retries: -1
timeout:
accessKey:
secretKey:
consumerProperties:
# canal tcp consumer
# 修改位置1:Canal-deployer所在主机IP
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://192.168.11.82:3306/mynet?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
username: ymliu
password: ymliu2023
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.11.28:3306/mynet?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false
jdbc.username: ymliu
jdbc.password: ymliu2023
druid.stat.enable: false
druid.stat.slowSqlMillis: 1000
# - 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
# - name: phoenix
# key: phoenix
# properties:
# jdbc.driverClassName: org.apache.phoenix.jdbc.PhoenixDriver
# jdbc.url: jdbc:phoenix:127.0.0.1:2181:/hbase/db
# jdbc.username:
# jdbc.password:
修改canal-adapter/conf/rdb文件夹下的yml文件
cd /usr/local/canal/canal-adapter/conf/rdb
vi mytest_user.yml
同步数据库下的某张表,例如同步mytest数据库下的user表,操作如下:
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:
同步数据库下所有表数据,例如:同步mytest数据库下所有表数据,操作如下:
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
mirrorDb: true
database: test # 该数据库名称修改为你的数据库名称
启动canal-adapter
cd /usr/local/canal/canal-adapter/bin
./startup.sh
出现错误,排查方式同canal-deployer
查看日志信息
cd /usr/local/canal/canal-adapter/logs/adapter
cat adapter.log
补充说明:
1、只有canal-adapter成功启动并正确连接canal-deployer后,canal-deployer才会读取binlog信息。/usr/local/canal/canal-deployer/conf/example 文件夹下才会出现meta.dat文件。
2、canal-adapter启动以后会出现127.0.0.1:3306/canal_manage连接失败信息,该信息是因为我们没有安装启动前端页面所致,可以忽略,不影响数据同步。
3、以上所有内容均为自己实操结果。
基于Canal实现MySQL 8.0 数据库数据同步的更多相关文章
- Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...
- 两台Mysql数据库数据同步实现
两台Mysql数据库数据同步实现 做开发的时候要做Mysql的数据库同步,两台安装一样的系统,都是FreeBSD5.4,安装了Apache 2.0.55和PHP 4.4.0,Mysql的版本是4.1. ...
- Mysql的主从数据库没有同步的解决办法
Mysql的主从数据库没有同步的解决办法 今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常. ...
- 解决Mysql的主从数据库没有同步的两种方法
今天发现Mysql的主从数据库没有同步 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多.发现很正常.show master status; ...
- TiDB 作为 MySQL Slave 实现实时数据同步
由于 TiDB 本身兼容绝大多数的 MySQL 语法,所以对于绝大多数业务来说,最安全的切换数据库方式就是将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,这样对业务方实现完全没有侵入性 ...
- k8s部署canal-1.1.6版本实现MySQL数据库数据同步
1.版本说明 软件&镜像 版本&镜像信息 说明 Kubernetes v1.23.7 k8s服务器 Kuboard v3.5.2.0 k8s连接管理工具 Canal v1.1.6 数据 ...
- 几篇关于MySQL数据同步到Elasticsearch的文章---第二篇:canal 实现Mysql到Elasticsearch实时增量同步
文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484377&idx=1&sn=199bc88 ...
- 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原
一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...
- 基于MySQL Binlog的Elasticsearch数据同步实践
一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...
- 把mmapv1存储引擎存储的mongodb3.0数据库数据复制到WiredTiger存储引擎的mongodb3.2中
mongodb3.0在mmapv1的存储引擎基础上添加了一个新的存储引擎WiredTiger.但是3.0的默认存储引擎依旧是mmapv1,因此我们项目之前也就用的默认方式. 但是mongodb更新实在 ...
随机推荐
- 运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created
运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created 原因: ...
- Rfost的自我介绍+软工五问
自我介绍+软工五问 问题 解答 这个作业属于哪个课程 网工1934-软件工程 这个作业要求在哪里 作业要求 这个作业的目标 让学生对软件工程有个初步的了解,同时掌握基础的markdown语法和博客园的 ...
- Think Python 学习笔记
#!/usr/bin/env python# coding: utf-8# # Think Python 学习笔记# 1.关于异或计算符# In[2]:6^2# 2.关于函数# 注意:变量名称不能用数 ...
- C/C++ 数据结构顺序栈的基本操作实现
#include <iostream> #include <Windows.h> using namespace std; #define MAXSIZE 6 //顺序栈的实现 ...
- Appium--滑动屏幕、不常用API
1.滑动屏幕api #滑动屏幕 size = driver.get_window_size() #获取屏幕大小 width = size.get('width') #宽 height = size.g ...
- lnmp重新安装mysql
安装mysql好长时间,一直没去管,后来一直频繁重启,各种网上找方案去解决,最后问题太异常,一顿操作猛如虎之后把mysql彻底搞垮,无奈只能进行重装. whereis mysql mysql: /us ...
- vue3.0知识整理与总结
在性能方面,对比Vue2.x,性能提升了1.3~2倍左右:打包后的体积也更小了. 非兼容的功能 一些和Vue2.x版本改动较大的语法,在Vue3存在兼容问题 v-modal 组件通信 v-for ...
- React支持less操作
React支持less操作 1.执行暴漏命令 npm run eject 2.输入" Y " 确认 这时候发现config文件夹没暴漏出来,是因为git没有暂存,得执行如下命令: ...
- day2 java基础语法
day1复习 1.java的特点 2.jdk,jre,jvm的关系 3.为什么要配置path 基本语法 1.关键字与保留字 2.标识符与标识符规则 3.java的命名规范 起名时提高阅读性尽量有意义 ...
- Markdown操作方法
Markdown学习 标题 三级标题 四级标题 字体 原本 hello,world! 斜体 hello,world! 加粗 hello,world! 斜体加粗 hello,world! 删除 hell ...