基于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版本: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 使用前者

基于Canal实现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;

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实现MySQL 8.0 数据库数据同步
只需要下载标红框的两个文件即可。复制到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

修改内容如下:
基于Canal实现MySQL 8.0 数据库数据同步

# 修改说明
第一个框:主库所在服务器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

若出现如下信息:
基于Canal实现MySQL 8.0 数据库数据同步
解决方案:(在此强烈建议系统中只安装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、以上所有内容均为自己实操结果。文章来源地址https://www.toymoban.com/news/detail-422650.html

到了这里,关于基于Canal实现MySQL 8.0 数据库数据同步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实现↝Mysql数据库主从复制搭建与同步

    一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。 如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先

    2024年02月10日
    浏览(51)
  • Mysql数据库--实现主从复制搭建与同步

    一般数据库都是读取压力大于写数据压力,主从复制即为了实现数据库的负载均衡和读写分离。通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,主服务器只负责写,而从服务器只负责读。 如生产环境中,使用redis数据库作为缓存数据库,用户访问业务数据时,先

    2024年02月08日
    浏览(57)
  • Canal+Kafka实现Mysql数据同步

    canal [kə\\\'næl] ,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。 canal是应阿里巴巴存在杭州和美国的双机房部署,存在跨机房同步的业务需求而提出的。

    2024年02月12日
    浏览(47)
  • canal实现mysql数据实时同步到es

    最近有一个需求:原有一些mysql数据,这些数据量很大,且包含文本信息,需要对其进行搜索,这时如果使用mysql的like来匹配,效率会很低,且很可能影响整个系统的运行,经过和同事的讨论,最终决定使用es来做搜索。 但是源数据有很多关联关系,搜索的时候也会带上这些

    2024年02月16日
    浏览(60)
  • 基于Canal+kafka监听数据库变化的最佳实践

    1、前言         工作中,我们很多时候需要根据某些状态的变化更新另一个业务的逻辑,比如订单的生成,成交等,需要更新或者通知其他的业务。我们通常的操作通过业务埋点、接口的调用或者中间件完成。         但是状态变化的入口比较多的时候,就很容易漏掉

    2023年04月08日
    浏览(78)
  • 使用canal+rocketmq实现将mysql数据同步到es

    实际开发过程中,经常遇到数据库与缓存不一致的问题,造成这种问题的原因有很多,其中缓存数据没有及时更新、缓存中过期的数据没有及时更新,导致缓存中存在失效数据,导致数据库与缓存不一致。而这种问题的出现大部分都是因为同步延迟、缓存失效、过期和错误使

    2024年02月11日
    浏览(49)
  • 企业级开发项目实战——基于RabbitMQ实现数据库、elasticsearch的数据同步

    1、商品上架时:search-service新增商品到elasticsearch 2、商品下架时:search-service删除elasticsearch中的商品 数据同步是希望,当我们商品修改了数据库中的商品信息,索引库中的信息也会跟着改。在微服务中数据库和索引库是在两个不同的服务中。如果,商品的服务,向es的服务中

    2024年02月12日
    浏览(67)
  • 基于Canal与Flink实现数据实时增量同步(一)

    vi conf/application.yml server: port: 8089 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 spring.datasource: address: kms-1:3306 database: canal_manager username: canal password: canal driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:// s p r i n g . d a t a s o u r c e . a d d r e s s / {spring.datasource.address}/ s p r in g . d

    2024年04月13日
    浏览(50)
  • 本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

    本地搭建canal实现mysql数据到es的简单的数据同步,仅供学习参考 建议首先熟悉一下canal同步方式:https://github.com/alibaba/canal/wiki 本地搭建MySQL数据库 本地搭建ElasticSearch 本地搭建canal-server 本地搭建canal-adapter 本地环境为window11,大部分组件采用docker进行部署,MySQL采用8.0.27, 推荐

    2024年02月02日
    浏览(56)
  • 开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之二

    修改用户的初始密码: mysqlalteruserroot@localhostidentifiedby\\\'Qaz1234; 或者: mysqlalteruseruser0identifiedby\\\'Qaz_1234\\\'; 在版本5.x中: mysqlsetpassword=password(Qaz_1234\\\'); 可执行文件: 服务器端:mysgld多线程 客户端:mysqlmysqladminmysqldumpmysqlbackup mysqlshowdatabases; mysqlselectdatabaseO; mysqlselectuser0; mysqlcrea

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包