在ETL过程中,如何获取增量数据是完成ETL过程的主要解决问题,前面文章ETL增量数据的捕获中,使用日志对比的方法是一种比较好的获取增量数据流的方式,那篇文章里主要介绍了SQL Server的Change Data Capture
这么个功能来完成增量数据的获取任务,这篇文章介绍一下对于MySQL来说,如何通过读取binlog来获取增量数据。
MySQL的日志
MySQL 的日志包括错误日志(ErrorLog),更新日志(Update Log),二进制日志(Binlog),查询日志(Query Log),慢查询日志(Slow Query Log)等。在默认情况下,系统仅仅打开错误日志,关闭了其他所有日志。
开启Binlog
MySQL 默认没有开启 Binlog,下面要开启Binlog。mac上使用brew安装的mysql,默认安装后的目录是/usr/local/Cellar,在这个目录中没有MySQL的配置文件my.cnf
,在系统中查看my.cnf
的路径
1 | mysql --help --verbose | grep my.cnf |
可以看到MySQL是按照这个顺序来读取配置文件的,下面在目录/etc/
下新建文件my.cnf`,并添加如下来开启Binlog
1 | [mysqld] |
重启MySQL服务
1 | mysql.server restart |
查看Binlog是否开启
1 | show variables like "%log_bin%"; |
简单查看Binlog内容
首先创建一个表test,然后向表中插入两条数据
1 | create table test(id int, name varchar(20)) engine=innodb charset=utf8; |
显示当前使用的Binlog及所处位置,然后查看这个二进制文件内容
1 | show master status; |
使用MySQL内置的mysqlbinlog工具查看和操作Binlog
1 | mysqlbinlog -v mysql-bin.000002 |
可以看到刚才创建表和插入数据的操作都被记录下来了。关于Binlog更详细内容,参考MySQL官方文档The Binary Log
使用Canal监听MySQL增量数据
Canal是阿里开源的MySQL数据库Binlog的增量订阅&消费组件
MySQL的Binlog有两个重要用途:主从复制和数据恢复,关于主从复制的内容,参考MySQL主备复制原理、实现及异常处理
这里其实利用了MySQL支持主从复制的原理,Master产生Binlog记录增删改语句,通过将Binlog发送到Slave节点从而完成Binlog的解析。下图是原理图
Canal是CS结构
安装配置Canal服务端
下载canal releases包,解压之后,编辑conf/example文件夹下的instance.properties
:
1 | ################################################# |
address设置为mysql的连接地址,defaultDatabaseName设置为自己要监听的库名,这里是tutorial
在MySQL命令行,创建一个新用户,作为slave,这个用户对应配置文件里的dbUsername
1 | CREATE USER canal IDENTIFIED BY 'canal!QAZ2wsx'; |
启动
1 | sh bin/startup.sh |
启动后可以在logs目录下查看日志
编写Canal客户端程序
新建一个java maven项目,pom.xml里添加依赖
1 | <dependency> |
1 | import com.alibaba.otter.canal.client.CanalConnector; |
模拟MySQL的变化
创建一张新表,插入一条数据,然后更新这条数据,最后删除这条数据,查看一下canal客户端是不是抓取到了增量数据:
1 | create table test_canal(id int, name varchar(20)) engine=innodb charset=utf8; |
可以看到,创建了一个表,然后插入一条新数据,然后更新了这条数据,更新前后的值都可以看到。