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

news2025/1/19 20:24:46

前言

服务器说明

主机名称操作系统说明
192.168.11.82Ubuntu 22.04主库所在服务器
192.168.11.28Oracle Linux Server 8.7从库所在服务器

版本说明

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-plaintext language-txt">MySQL版本:MySQL_8.0.32
Canal版本:Canal_1.1.7
           //我的canal安装部署在192.168.11.82上,当然你也可以部署在其它的服务器上
Java版本:1.8.0.362
</code></span></span>

配置MySQL8.0数据库

修改MySQL配置文件

1、Ubuntu系统下MySQL配置文件位置
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /etc/mysql/mysql.conf.d
vi mysqld.cnf
</code></span></span>
2、CentOS系统下MySQL配置文件位置
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">vi /etc/my.cnf
</code></span></span>
3、添加如下配置,开启MySQL binlog功能
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-powershell"><span style="color:#008000"># 服务编号, 与其它节点不冲突即可</span>
server_id=<span style="color:#880000">1</span>
log_bin=binlog
binlog_format=ROW
</code></span></span>

Canal简介

关于canal简介,这里就不再阐述,具体可以参看官方文档介绍,地址如下:

https://github.com/alibaba/canal/wiki/简介

主库服务器操作

启动MySQL8.0数据库

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-powershell">systemctl <span style="color:#0000ff">start</span> mysql  或者
systemctl <span style="color:#0000ff">start</span> mysqld.service
Ubuntu 使用前者
</code></span></span>

在这里插入图片描述

创建账号密码

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-sql">mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">CREATE</span> <span style="color:#0000ff">USER</span> canal IDENTIFIED <span style="color:#0000ff">BY</span> <span style="color:#a31515">'canal'</span>;  
mysql<span style="color:#ab5656">></span> <span style="color:#0000ff">GRANT</span> <span style="color:#0000ff">SELECT</span>, <span style="color:#0000ff">SHOW</span> <span style="color:#0000ff">VIEW</span>, REPLICATION SLAVE, REPLICATION CLIENT <span style="color:#0000ff">ON</span> <span style="color:#ab5656">*</span>.<span style="color:#ab5656">*</span> <span style="color:#0000ff">TO</span> <span style="color:#a31515">'canal'</span>@<span style="color:#a31515">'%'</span>;
mysql<span style="color:#ab5656">></span> FLUSH PRIVILEGES;
</code></span></span>

canal数据同步服务器操作

创建canal文件夹

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local
mkdir canal
cd canal
mkdir canal-package canal-adapter canal-deployer
</code></span></span>

安装canal deployer和canal adapter

官网下载地址

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-plaintext language-txt">https://github.com/alibaba/canal/releases/tag/canal-1.1.7-alpha-2
</code></span></span>

在这里插入图片描述
只需要下载标红框的两个文件即可。复制到canal-package文件夹下。
解压

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">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
</code></span></span>

配置和启动canal-deployer

配置canal-deployer

由于此次同步为MySQL数据库间的数据同步,所以只需修改 instance.properties 即可。

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-deployer/conf/example
vi instance.properties
</code></span></span>

修改内容如下:
在这里插入图片描述

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-php"><span style="color:#008000"># 修改说明</span>
第一个框:主库所在服务器IP
第二个框:主库数据库账号密码
第三个框:规则如下:
instance.properties中同步数据表默认为同步数据库下所有的表信息,具体配置如图第三个框:
<span style="color:#008000"># 若需要同步某几张表,可以参考如下配置:</span>
<span style="color:#008000"># 同步某数据库test1下的user表,test2数据库下的所有表,所有库下所有表数据</span>
canal.instance.filter.regex=test1.user,test2\\..*,.*\\..*
</code></span></span>

启动canal-deployer

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-deployer/bin
./startup.sh
</code></span></span>

查看日志确定是否启动成功

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-deployer/logs/example
cat example.log
</code></span></span>

我遇到的几个错误情况,仅供参考:
canal-deployer启动之后,如果在 logs 文件夹下没有 example 文件,参考如下情况说明:
1、查看 /usr/local/canal/canal-deployer/bin 文件夹下,是否存在.pid的文件。
2、查看logs文件夹下的canal文件夹下的canal_stdout.log文件,命令如下:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cat /usr/local/canal/canal-deployer/logs/canal/canal_stdout.log
</code></span></span>

若出现如下信息:
在这里插入图片描述
解决方案:(在此强烈建议系统中只安装jdk8或者jdk11,切不可采用jenv管理jdk,安装多个版本)

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-deployer/bin
./stop.sh
vi startup.sh
<span style="color:#2b91af"># </span>删除报错信息包含的参数(该错误信息可能会出现多次,出现哪个删除哪个即可)
./startup.sh
</code></span></span>

重新启动:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-deployer/bin
./startup.sh
</code></span></span>

直到出现以下信息:

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell"><span style="color:#2b91af"># </span>打开日志文件
cat /usr/local/canal/canal-deployer/logs/example/example.log
<span style="color:#2b91af"># </span>出现以下信息说明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
</code></span></span>

配置canal-adapter

修改配置文件

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-adapter/conf
vi application.yml
</code></span></span>
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">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:
<span style="color:#2b91af"># </span>修改位置:添加源库配置信息,此处为同步同库下所有表信息
  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
<span style="color:#2b91af"># </span>     - name: rdb
<span style="color:#2b91af"># </span>       key: oracle1
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         jdbc.driverClassName: oracle.jdbc.OracleDriver
<span style="color:#2b91af"># </span>         jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
<span style="color:#2b91af"># </span>         jdbc.username: mytest
<span style="color:#2b91af"># </span>         jdbc.password: m121212
<span style="color:#2b91af"># </span>     - name: rdb
<span style="color:#2b91af"># </span>       key: postgres1
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         jdbc.driverClassName: org.postgresql.Driver
<span style="color:#2b91af"># </span>         jdbc.url: jdbc:postgresql://localhost:5432/postgres
<span style="color:#2b91af"># </span>         jdbc.username: postgres
<span style="color:#2b91af"># </span>         jdbc.password: 121212
<span style="color:#2b91af"># </span>         threads: 1
<span style="color:#2b91af"># </span>         commitSize: 3000
<span style="color:#2b91af"># </span>     - name: hbase
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         hbase.zookeeper.quorum: 127.0.0.1
<span style="color:#2b91af"># </span>         hbase.zookeeper.property.clientPort: 2181
<span style="color:#2b91af"># </span>         zookeeper.znode.parent: /hbase
<span style="color:#2b91af"># </span>     - name: es
<span style="color:#2b91af"># </span>       hosts: 127.0.0.1:9300 <span style="color:#008000"># 127.0.0.1:9200 for rest mode</span>
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         mode: transport <span style="color:#008000"># or rest</span>
<span style="color:#2b91af"># </span>         <span style="color:#008000"># security.auth: test:123456 #  only used for rest mode</span>
<span style="color:#2b91af"># </span>         cluster.name: elasticsearch
<span style="color:#2b91af"># </span>     - name: kudu
<span style="color:#2b91af"># </span>       key: kudu
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         kudu.master.address: 127.0.0.1 <span style="color:#008000"># ',' split multi address</span>
<span style="color:#2b91af"># </span>     - name: phoenix
<span style="color:#2b91af"># </span>       key: phoenix
<span style="color:#2b91af"># </span>       properties:
<span style="color:#2b91af"># </span>         jdbc.driverClassName: org.apache.phoenix.jdbc.PhoenixDriver
<span style="color:#2b91af"># </span>         jdbc.url: jdbc:phoenix:127.0.0.1:2181:/hbase/db
<span style="color:#2b91af"># </span>         jdbc.username:
<span style="color:#2b91af"># </span>         jdbc.password:

</code></span></span>

修改canal-adapter/conf/rdb文件夹下的yml文件

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-adapter/conf/rdb
vi mytest_user.yml
</code></span></span>
同步数据库下的某张表,例如同步mytest数据库下的user表,操作如下:
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">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配置为准)
<span style="color:#2b91af">  #</span>targetColumns:               <span style="color:#008000"># 字段映射, 格式: 目标表字段: 源表字段, 如果字段名一样源表字段名可不填</span>
<span style="color:#2b91af">  # </span> <span style="color:#0000ff">id</span>:
<span style="color:#2b91af">  # </span> name:
<span style="color:#2b91af">  # </span> role_id:
<span style="color:#2b91af">  # </span> c_time:
<span style="color:#2b91af">  # </span> test1: 
</code></span></span>
同步数据库下所有表数据,例如:同步mytest数据库下所有表数据,操作如下:
<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  mirrorDb: true
  database: test          # 该数据库名称修改为你的数据库名称
</code></span></span>

启动canal-adapter

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-shell">cd /usr/local/canal/canal-adapter/bin
./startup.sh
</code></span></span>

出现错误,排查方式同canal-deployer
查看日志信息

<span style="color:#000000"><span style="background-color:#ffffff"><code class="language-powershell"><span style="color:#0000ff">cd</span> /usr/local/canal/canal<span style="color:#a31515">-adapter</span>/logs/adapter
<span style="color:#0000ff">cat</span> adapter.log
</code></span></span>

补充说明:

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、以上所有内容均为自己实操结果。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

carla中lka实现(二)

前言&#xff1a; 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离&#xff0c;&#xff0c;并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上&#xff0c;所获得的图像的中间线极为车辆的中心。 …

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说&#xff0c;有几组激光收发模块&#xff0c;垂直方向上就有几条线&#xff0c;被称为线数。这种情况下&#xff0c;线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲&#xff0c;线数越高&#xff0c;激光器的…

Adobe Acrobat 无法使用 PS 编辑图片 的解决方法

问题描述 使用较新版本的Adobe Acrobat时&#xff0c;有时会遇到问题。 比如对pdf中的图片使用 PS 进行编辑&#xff0c;会弹出以下窗口&#xff0c;导致打不开 PS &#xff0c;无法对图片进行编辑。 Adobe 无法启动您指定的图像编辑应用程序。请在"首选项"的"…

【STM32CubeMX】低功耗模式

前言 本文讲解STM32F10X的低功耗模式&#xff0c;部分资料参考自STM32手册。STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模…

双环传动CIO吴学信:数字化转型为企业高效运转和业绩腾飞提供重要支撑

引言 浙江双环传动机械股份有限公司&#xff08;股票代码&#xff1a;002472&#xff09;创建40年来专注于机械传动核心部件——齿轮及其组件的研发、制造与销售&#xff0c;已成为全球最大的专业齿轮产品制造商和服务商之一。 2019年以来&#xff0c;双环传动与纷享销客CRM建…

【0Ω电阻在PCB板中的5大常见作用】

文章目录 前言1、充当跳线2、进行调试时的前后级隔离3、让调试更灵活4、方便测试电流5、用于单点接地 前言 在PCB板中&#xff0c;时常见到一些阻值为0Ω的电阻。我们都知道&#xff0c;在电路中&#xff0c;电阻的作用是阻碍电流&#xff0c;而0Ω电阻显然失去了这个作用。那…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

new String()到底创建了几个对象

题目&#xff1a; new String&#xff08;"abc"&#xff09;会创建几个对象&#xff1f; 看字节码&#xff0c;就知道是两个。

经验分享丨HR告诉你:同样是找工作,这些简历绝对会被直接刷掉!

上次的文章分享了自己软件测试面试时的一些经历&#xff0c;今天我想分享一下自己当时写简历以及投简历方面的经历&#xff0c;本文内容纯粹是个人简单分享&#xff0c;如果有写得不好的地方还请读者包涵与指正。 我是去年的九月初开始投递简历的&#xff0c;貌似各行各业的人都…

[JavaWeb]【七】web后端开发-MYSQL

前言&#xff1a;MySQL是一种流行的关系型数据库管理系统,它的作用是存储和管理数据。在Web开发中,MySQL是必备的数据库技能之一,因为它可以帮助Web开发人员处理大量的数据,并且提供了强大的数据查询和管理功能。 一 数据库介绍 1.1 什么是数据库 1.2 数据库产品 二 MySQL概述…

电煎锅出口欧洲CE认证标准

电煎锅是家庭烹饪中比较常见的电器&#xff0c;一般家庭在日常生活中都会使用&#xff0c;所以电煎锅具有广大的市场&#xff0c;尤其在欧洲市场更是日常烹饪离不开的家庭电器。欧洲是我国出口比例占比较大的地区&#xff0c;每年出口到欧洲的家庭电器占很大一部分。而根据欧盟…

3 Python的数据类型

概述 在上一节&#xff0c;我们介绍了Python的基础语法&#xff0c;包括&#xff1a;编码格式、标识符、关键字、注释、多行、空行、缩进、引号、输入输出、import、运算符、条件控制、循环等内容。Python是一种动态类型的编程语言&#xff0c;这意味着当你创建一个变量时&…

解决c/c++ Error: redefinition of ‘xxx’ 的问题

错误信息 两个类/文件同时引用定义ReplyInfo的头文件&#xff0c;会造成头文件中定义重复定义 如两个类/文件重复引用massage文件报错 message.h:36:16: error: redefinition of struct MSG_SERVOCTRL message.h:40:2: error: conflicting types for servoctrl解决 一般是目…

[SWPUCTF 2022 新生赛]ez_ez_php

这段代码是一个简单的PHP文件处理脚本。让我们逐行进行分析&#xff1a; error_reporting(0); - 这行代码设置了错误报告的级别为0&#xff0c;意味着不显示任何错误。 if (isset($_GET[file])) { - 这行代码检查是否存在一个名为"file"的GET参数。 if ( substr($_…

步步为赢:打造一个酷炫而吸引人的Hadoop HDFS分布式文件系统集群部署方案

文章目录 版权声明一 分布式存储缘起二 分布式的基础架构2.1 大数据架构模式2.2 主从模式 三 HDFS的基础架构HDFS的角色组成 四 HDFS集群环境部署4.1 安装包下载4.2 Hadoop安装包目录结构4.3 修改配置文件&#xff0c;应用自定义设置4.4 分发Hadoop文件夹4.5 配置环境变量4.6 授…

【论文笔记】基于指令回译的语言模型自对齐-MetaAI

MetaAI最近发布的Humpback&#xff0c;论文链接&#xff1a;https://arxiv.org/abs/2308.06259 解决什么问题&#xff1f; 大量高质量的指令微调数据集的生成。 思路 在这项工作中&#xff0c;我们通过开发迭代自训练算法来利用大量未标记的数据来创建高质量的指令调优数据集…

IC流程中 DFT 学习笔记(2)

引言 DFT是ASIC芯片设计流程中不可或缺的环节。其主要目的是在芯片前端设计验证完成后插入一些诸如寄存器链等可供测试的逻辑&#xff0c;算是IC后端设计的范畴&#xff0c;属于结构测试而非功能测试。主要是在ASIC芯片流片完成后&#xff0c;通过这些已插入的逻辑&#xff0c…

Rancher-RKE-install 部署k8s集群

一、为什么用Rancher-RKE-install 1.CNCF认证的k8s安装程序。 2.有中文文档。 二、安装步骤 1.下载Rancher-Rke的二进制包-下面是项目的地址 GitHub - rancher/rke: Rancher Kubernetes Engine (RKE), an extremely simple, lightning fast Kubernetes distrib…

javaScript:还有人不会js中的Math方法?

目录 一.前言 二.Math方法 1.Math.floor()向下取整&#xff08;重点&#xff09; 示例 注意 2.Math.ceil()向上取整 示例 3.Math.round() 四舍五入 示例 4.Math.random()随机数&#xff08;重点&#xff09; 范围 示例 m-n之间的随机整数数(重点) 示例 输出10个[2…

时序结构重要性加权图卷积网络用于时序知识图谱补全

目录 摘要部分 四元数 时间戳 时间信息对四元数的影响 知识图谱里的结构信息 时序注意模块 重要性加权的图卷积网络 引言部分 现有方法的不足 本文主要贡献 准备工作 问题定义 大部分方法的缺陷 本文方法 框架 时序注意模块 实体分类 带有注意力机制的双向长短…