Canal进行MySQL到MySQL数据库全量+增量同步踩坑指南

 更新时间:2023年10月02日 08:09:58   投稿:wdc  
这篇文章主要介绍了使用Canal作为迁移工具,将数据库从A服务器迁移至B服务器,为了尽量减少迁移导致的停机时间,考虑使用全量迁移+增量同步的方式

背景

最近工作中遇到一个迁移数据库的需求,需要将数据库从A服务器迁移至B服务器,为了尽量减少迁移导致的停机时间,考虑使用全量迁移+增量同步的方式,最终选择使用Canal作为迁移工具

准备工作

1. 数据库

两台服务器的数据库都需要提前准备好数据库账号,用于Canal进行数据库连接,因为Canal是伪装成从库读取源数据的,所以需要对源库进行一些配置,比如账号需要授予从库权限(如果给的是最高权限账号,那基本不用担心这个)、保证Canal部署的程序与数据库网络互通、以及最重要的!开启ROW格式的Binlog,这个非常重要!

2.Canal安装

使用Canal进行全量和增量同步需要用到两个组件,Canal adapter、Canal deployer,可自行前往github仓库下载。

Canal配置启动增量同步和全量同步

1.deployer配置

将下载的两个组件解压,首先配置deployer

主要关注conf目录

进入example目录,编辑instance.properties文件:

重点关注这几个参数:canal.instance.master.addresscanal.instance.dbUsernamecanal.instance.dbPasswordcanal.instance.filter.regex(重要)

这样就配置好了deployer,回到deployer的bin目录,执行startup.sh即可启动deployer程序(此时还未同步)

#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0
# enable gtid use true/false
canal.instance.gtidon=false
# position info
canal.instance.master.address=这里填写源数据库的ip:端口
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=
# username/password
canal.instance.dbUsername=填写源数据库用户名,例:root
canal.instance.dbPassword=填写源数据库密码,例:root
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==
# table regex
canal.instance.filter.regex=这里填写需要进行同步的数据库表名,格式:数据库名.表名,多个表用逗号分分隔,例如:testdb.user,testdb.role,testdb.menu
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch
# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.enableDynamicQueuePartition=false
#canal.mq.partitionsNum=3
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#################################################

2.adapter配置

同样,进入conf目录

首先编辑bootstrap.yml文件,将里面的配置全部注释,因为我们没有用上admin的服务,不需要连Canal自身的数据库

#canal:
#  manager:
#    jdbc:
#      url: jdbc:mysql://127.0.0.1:3306/canal_manager?useUnicode=true&characterEncoding=UTF-8
#      username: canal
#      password: canal

接着编辑application.yml文件

主要关注canal.conf.srcDataSources和canal.conf.canalAdapters下的配置

srcDataSources:
  defaultDS:
    url: 这里填源数据库的jdbc连接信息,例:jdbc:mysql://127.0.0.1:3306/testdb
    username: 数据库账号,例:root
    password: 数据库密码,例:root
    maxActive: 100 #额外增加这一行,默认的连接数只有3,会导致全量同步出现异常,导致全量同步数据缺失,最好改大一点
canalAdapters:
- instance: example #这里就保留叫example,只是个命名
  groups:
  - groupId: g1
    outerAdapters:
    - name: logger
    - name: rdb
      key: mysql1 # 这里保持默认即可
      properties:
        jdbc.driverClassName: com.mysql.jdbc.Driver #数据库驱动就保持这个驱动,不要修改为带cj的那个驱动,如果这个驱动有问题,再考虑更换驱动
        jdbc.url: 这里填写需要同步接收方的数据库链接,例:jdbc:mysql://192.168.1.2:3309/testdb?useUnicode=true
        jdbc.username: root
        jdbc.password: 123456
        druid.stat.enable: false
        druid.stat.slowSqlMillis: 1000

修改好文件后保存

增量同步配置

由于本文场景是从mysql同步到另一个mysql,如果需要同步到es或者其他系统,请参考github内的教程

同步到mysql(或是其他关系型数据库)则接着进入到rdb目录

该文件夹内,里面已经有一个示例yml文件,一个yml文件一般配置一个同步表,如果有多个表需要同步,则复制多个yml副本,将文件名修改为库名_表名.yml,方便归类,本文由于只有一个库,就直接命名为表名.yml

以本文为例,复制默认yml文件3份,分别命名为user.yml、role.yml、menu.yml,代表三个表,接下来以user.yml配置为例

dataSourceKey: defaultDS #无需修改
destination: example #这个对应application.yml文件中的
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  database: epidemic #需要同步的数据库名,两台服务器的数据库名最好命名成一样的,不然可能有各种意外情况发生
  table: user #需要同步的表名
  targetTable: user #同步到目标服务器对应的表名
  targetPk: 
    id: id # 主键,格式为, 源表主键名:目标表主键名
  mapAll: true # 映射所有字段,这里改为true的话,下面的targetColumns就可以不用改了,除非两边的数据结构不一样
#  targetColumns:
#    id:
#    name:
#    role_id:
#    c_time:
#    test1:
#  etlCondition: "where c_time>={}"
  commitBatch: 3000 # 批量提交的大小,保持不动即可

其他几个表的yml文件填写方式类似

修改好配置文件后,回到adapter的bin目录内,执行startup.sh,启动adapter,此时可以查看adapter/logs/adapter/adapter.log,如果里面开始有输出DML语句则代表增量同步已经开始了

3.全量同步

使用命令行执行如下命令,即可启动全量同步:
curl http://canal部署的ip:8081/etl/rdb/mysql1/rdb目录内对应表的文件名.yml -X POST例如:
curl http://127.0.0.1:8081/etl/rdb/mysql1/user.yml -X POST依然查看adapter/logs/adapter/adapter.log日志即可看到全量同步的输出

完成

至此,增量同步和全量同步都完成了

到此这篇关于Canal进行MySQL到MySQL数据库全量+增量同步踩坑指南的文章就介绍到这了,更多相关Canal进行MySQL到MySQL数据库全量+增量同步踩坑指南内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解MySQL的limit用法和分页查询语句的性能分析

    详解MySQL的limit用法和分页查询语句的性能分析

    本篇文章主要介绍了详解MySQL的limit用法和分页查询语句的性能分析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • Mysql导入导出时遇到的问题解决

    Mysql导入导出时遇到的问题解决

    这篇文章主要给大家介绍了关于Mysql导入导出时遇到问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • SQL计算timestamp的差值的方法

    SQL计算timestamp的差值的方法

    这篇文章主要介绍了SQL计算timestamp的差值的方法的相关资料,需要的朋友可以参考下
    2017-05-05
  • MySQL 数据类型 大全

    MySQL 数据类型 大全

    mysql下的一些数据类型,后面附有类型的说明。
    2009-04-04
  • MySQLMerge存储引擎

    MySQLMerge存储引擎

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。本文给大家介绍MySQLMerge存储引擎,需要的朋友参考下吧
    2016-03-03
  • MySQL存储过程in、out和inout参数示例和总结

    MySQL存储过程in、out和inout参数示例和总结

    这篇文章主要给大家介绍了关于MySQL存储过程in、out和inout参数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MySQL的IF函数语法及最佳实践应用

    MySQL的IF函数语法及最佳实践应用

    本文将深入解析IF函数的语法特性、应用场景及最佳实践,助您高效利用这一工具提升SQL编写能力,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • MySQL数据库是如何实现XA规范的

    MySQL数据库是如何实现XA规范的

    这篇文章主要介绍了MySQL数据库是如何实现XA规范的,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2021-01-01
  • MySQL系列理解运用union(all)与limit及exists关键字教程

    MySQL系列理解运用union(all)与limit及exists关键字教程

    这篇文章主要为大家介绍了MySQL系列中union(all)、limit及exists关键字的教程示例讲解,通过本篇文章就可以理解MySQL中的这些关键字的概念以及实际的运用
    2021-10-10
  • MySQL实现JDBC详细步骤

    MySQL实现JDBC详细步骤

    JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动,本文给大家介绍MySQL实现JDBC详细讲解,感兴趣的朋友一起看看吧
    2022-02-02

最新评论