基于Canal实现MySQL 8.0 数据库数据同步

Canal,数据库,数据,MySQL · 浏览次数 : 619

小编点评

# canal-adapter生成配置文件内容分析 # 1. canal-adapter配置文件中定义数据库连接信息 ``` database: test ... database: test ``` * canal-adapter配置文件中定义了数据库名称为“test”的连接信息,包括数据库地址、用户名和密码。 # 2. outerAdapterKey定义 ``` outerAdapterKey: mysql1 ``` * outerAdapterKey定义了用于同步的数据库名称为“mysql1”的 AdapterKey。 # 3. dbMapping定义 ``` mirrorDb: true database: test ``` * dbMapping定义了是否进行 MirrorDB模式同步的配置,以及目标数据库名称为“test”的数据库连接信息。 # 4. id属性定义 ``` id: id ``` * id属性定义了用于标识数据库记录的 ID属性,即为“id”。 # 5. 外键定义 ``` mapAll: true id: id name: id role_id: id c_time: id test1: 同步数据库下所有表数据 ``` * 外键定义了“id”属性的映射关系,即目标表中的“id”属性与源表中的“id”属性进行映射。 # 6. 映射配置示例 ``` targetColumns: # 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填 id: id ``` * 映射配置示例中定义了目标表中的“id”属性的映射方式为“id”。 # 7. 其他配置项 ``` mirrorDb: true database: test mapAll: true id: id ``` * 其他配置项中定义了 MirrorDB模式同步、目标数据库连接和 ID属性映射等配置项。

正文

前言

服务器说明

主机名称 操作系统 说明
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 数据库数据同步相似的内容:

基于Canal实现MySQL 8.0 数据库数据同步

前言 服务器说明 | 主机名称 | 操作系统 | 说明 | |--|--| | | 192.168.11.82 | Ubuntu 22.04 | 主库所在服务器 | | 192.168.11.28 | Oracle Linux Server 8.7 | 从库所在服务器 | 版本说明 MySQL版本:

基于 Three.js 的 3D 模型加载优化

作为一个3D的项目,从用户打开页面到最终模型的渲染加载的时间也会比普通的H5项目要更长一些,从而造成大量的用户流失。为了提升首屏加载的转化率,需要尽可能的降低loading的时间。这里就分享一些我们在模型加载优化方面的心得。

基于MindSpore实现BERT对话情绪识别

本文分享自华为云社区《【昇思25天学习打卡营打卡指南-第二十四天】基于 MindSpore 实现 BERT 对话情绪识别》,作者:JeffDing。 模型简介 BERT全称是来自变换器的双向编码器表征量(Bidirectional Encoder Representations from Trans

基于 Vagrant 手动部署多个 Redis Server

环境准备 宿主机环境:Windows 10 虚拟机环境:Vagrant + VirtualBox Vagrantfile 配置 首先,我们需要编写一个 Vagrantfile 来定义我们的虚拟机配置。假设已经在 D:\Vagrant\redis 目录下创建了一个 Vagrantfile,其内容如下:

基于EF Core存储的Serilog持久化服务

前言 Serilog是 .NET 上的一个原生结构化高性能日志库,这个库能实现一些比内置库更高度的定制。日志持久化是其中一个非常重要的功能,生产环境通常很难挂接调试器或者某些bug的触发条件很奇怪。为了在脱离调试环境的情况下尽可能保留更多线索来辅助解决生产问题,持久化的日志就显得很重要了。目前Ser

基于EF Core存储的国际化服务

前言 .NET 官方有一个用来管理国际化资源的扩展包Microsoft.Extensions.Localization,ASP.NET Core也用这个来实现国际化功能。但是这个包的翻译数据是使用resx资源文件来管理的,这就意味着无法动态管理。虽然官方有在文档中提供了一些第三方管理方案,但是都不太

基于FileZilla上传、下载服务器数据的方法

本文介绍FileZilla软件的下载、配置与使用方法。 在之前的博客中,我们提到了下载高分遥感影像数据需要用到FTP(文件传输协议,File Transfer Protocol)软件FileZilla;这一软件用以在自己的电脑与服务器之间相互传输数据,在进行下载科学数据、网站开发等等操作时,经常需要

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

基于electron31+vite5+pinia2跨端仿微信Exe聊天应用ViteElectronChat。 electron31-vite5-chat原创研发vite5+electron31+pinia2+element-plus跨平台实战仿微信客户端聊天应用。实现了聊天、联系人、收藏、朋友圈/短

基于 .net core 8.0 的 swagger 文档优化分享-根据命名空间分组显示

之前也分享过 Swashbuckle.AspNetCore 的使用,不过版本比较老了,本次演示用的示例版本为 .net core 8.0,从安装使用开始,到根据命名空间分组显示,十分的有用

跟我一起学习和开发动态表单系统-前端用vue、elementui实现方法(3)

基于 Vue、Element UI 和 Spring Boot + MyBatis 的动态表单系统前端实现解析 在现代企业信息系统中,动态表单是一种非常常见的功能。它可以根据业务需求灵活地调整表单结构,以满足不同的数据收集和展示需求。在本文中,我们将探讨一种基于 Vue、Element UI 和 S