基于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更新实在 ...
随机推荐
- MySQL 分组排序,取第一条
select t1.* from coal_installed_capacity t1where NOT EXISTS (select * from coal_installed_capacity t ...
- Java下变量大小写驼峰、大小写下划线、大小写连线转换
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artif ...
- Winform 使用DotNetBar 设置界面为Office2007 样式
public partial class FrmMain : DevComponents.DotNetBar.Office2007RibbonForm { public FrmMain() { Ini ...
- linux虚拟机设置网络显示NetworkManager need to be running
问题描述:在设置一台centOS7虚拟机的网络时出现: 解决方法: 命令行重启NetworkManager systemctl restart NetworkManager 刷新一次就好了
- python内置函数range()—对象创建函数
range()函数 介绍 range()函数实际上表示一个不可变的数字序列类型,通常用于在for循环中指定特定的次数. range()的格式: range(stop) range(start, sto ...
- [ACTF2020 新生赛]Include 1
首先进入靶场可以看到trip 查看源码 点击进入提示我们能不能找到flag 可以看到这里是文件包含,想着包含index.php但是根目录是自动索引的,无论输入什么都是trip页面 又想着包含flag. ...
- SublimeText实现Markdown快速预览
SublimeText是什么? SublimeText是一个文本编辑器,同时也是一个先进的代码编辑器.SublimeText具有漂亮的用户界面和强大的功能,它的主要功能包括:拼写检查,书签,完整的Py ...
- Eigen 中的 conservativeResize 和 resize 操作
Eigen 中的 conservativeResize 和 resize 操作 对于能够改变大小的动态矩阵,一般会有 resize() 操作. resize() 如果不改变原矩阵的大小,则原矩阵大小和 ...
- 疯一样的向自己发问 - 剖析lsm 索引原理
疯一样的向自己发问 - 剖析lsm 索引原理 lsm简析 lsm 更像是一种设计索引的思想.它把数据分为两个部分,一部分放在内存里,一部分是存放在磁盘上,内存里面的数据检索方式可以利用红黑树,跳表这种 ...
- Golang数据结构
数据类型 不同类型的内存样式图 append,切片添加元素 清空切片的3种方法 清空切片的2种方法 查看变量类型 使用 fmt.Printf package main import "fmt ...