简述
Canal是一个MySql增量日志解析组件,其原理是将自己伪装成一台MySql Slave机器发送dump请求给Master,然后Master推送binary log给Canal,Canal会解析bin log对象的byte流。Canal提供一系列接口由客户端对增量数据进行自己的业务处理。
数据库配置
开启binlog
MySql当前版本为5.7.15,首先需要开启mysql的binlog,因为mysql默认是不开启binlog的。
如何查看MySql是否开启了binlog?
首先需要mysql -uroot -p
进入mysql的客户端命令行,然后执行:
1 | mysql> show variables like 'log_%'; |
log_bin为on即代表开启了binlog,basename代表日志名称和路径。
如果没有开启,需要配置my.cnf文件,Linux/MAC系统下的路径为/etc/my.cnf
,Windows系统下路径为C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
,Linux/MAC系统下如果没有这个文件,可以新建一个或者从MySql的安装目录下的support-files里找到名为my-default.cnf文件复制到/etc/下,新增以下配置:
1 | log-bin=mysql-bin #binlog的名称 |
配置用户
如果想方便省事,可以跳过这步,无需为canal专门配置一个用户。
这里为canal专门新增一个用户,比较安全:
1 | --创建用户 |
扩展:grant命令用法:
grant 权限 on 数据库对象 to 用户
如果想更改其他用户密码:
1 | update mysql.user set authentication_string=password('qingyun1') where user='root' and Host = 'localhost'; |
重启数据库,可以使用上面的命令查看是否开启binlog。
查看当前的binglog文件名称以及作用的数据库:
1 | mysql> show master status; |
Canal部署安装
传送门:https://github.com/alibaba/canal/
解压开,然后进入conf目录,一般情况下没有用到集群的时候,canal.propertie可以无需配置,只需配置instance.properties文件即可.
1 | ################################################# |
然后可以直接到canal解压后的bin目录中执行脚本启动:sh startup.sh
Canal客户端接入
首先引入依赖:
1 | <dependency> |
直接复制官方的客户端示例代码:
1 | public class SimpleCanalClientExample { |
控制台可以看到输出:
empty count : 1
empty count : 2
empty count : 3
empty count : 4
然后给数据库新增一条数据,即可在客户端看到数据变更和类型:
================> binlog[master-bin.000045:237902.001946:313661577] , name[test,user] , eventType : INSERT
ID : 4 update=true
X : 2013-02-05 23:29:46 update=true
一些问题
假如出现rowChage.getRowDatasList()获得的数据集合为null或者集合中没有元素导致控制台并没有打印出以上信息(参照issues#1267以及FAQ),通常情况下是由于两种原因引起的:
- MySql的配置文件里的binlog-format没有配置为ROW;
- 在canal的配置文件里,即example的instance.properties的配置规则过滤掉了数据,检查一下该规则;
总结
可以通过canal实现MySql到各种其他数据库的迁移。