使用Canal进行MySQL到MySQL数据库全量+增量同步以及踩坑指南
背景
最近工作中遇到一个迁移数据库的需求,需要将数据库从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.address
,canal.instance.dbUsername
,canal.instance.dbPassword
,canal.instance.filter.regex
(重要)
1 | ################################################# |
这样就配置好了deployer,回到deployer的bin目录,执行startup.sh即可启动deployer程序(此时还未同步)
2.adapter配置
同样,进入conf目录
首先编辑bootstrap.yml文件,将里面的配置全部注释,因为我们没有用上admin的服务,不需要连Canal自身的数据库
1 | #canal: |
接着编辑application.yml文件
主要关注canal.conf.srcDataSources和canal.conf.canalAdapters下的配置
1 | srcDataSources: |
修改好文件后保存
增量同步配置
由于本文场景是从mysql同步到另一个mysql,如果需要同步到es或者其他系统,请参考github内的教程
同步到mysql(或是其他关系型数据库)则接着进入到rdb目录
该文件夹内,里面已经有一个示例yml文件,一个yml文件一般配置一个同步表,如果有多个表需要同步,则复制多个yml副本,将文件名修改为库名_表名.yml,方便归类,本文由于只有一个库,就直接命名为表名.yml
以本文为例,复制默认yml文件3份,分别命名为user.yml、role.yml、menu.yml,代表三个表,接下来以user.yml配置为例
1 | dataSourceKey: defaultDS #无需修改 |
其他几个表的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数据库全量+增量同步以及踩坑指南
https://www.stonewu.com/post/canal-synchronization-problem.html