最近在工作中,遇到了这样一个业务场景,我们需要关注一个业务系统数据库中某几张表的数据,当数据发生新增或修改时,将它同步到另一个业务系统数据库中的表中。
一提到数据库的同步,估计大家第一时间想到的就是基于binlog
的主从复制了,但是放在我们的场景中,还有几个问题:
-
第一,并不是需要复制所有表的数据,复制对象只有少量的几张表
-
第二,也是比较麻烦的,两个业务系统数据库表结构可能不一致。例如,要同步数据库1的A表中的某些字段到数据库2的B表中,在这一过程中,A表和B表的字段并不是完全相同
这样的话,我们只能通过代码的方式,首先获取到数据库1表中数据的变动,再通过手动映射的方式,插入到数据库2的表中。但是,获取变动数据的这一过程,还是离不开binlog
,因此我们就需要在代码中对binlog
进行一下监控。
先说结论,我们最终使用了一个开源工具mysql-binlog-connector-java
,用来监控binlog
变化并获取数据,获取数据后再手动插入到另一个库的表中,基于它来实现了数据的同步。这个工具的git项目地址如下:
https://github.com/shyiko/mysql-binlog-connector-java
在正式开始前,还是先简单介绍一下mysql
的binlog
,binlog
是一个二进制文件,它保存在磁盘中,是用来记录数据库表结构变更、表数据修改的二进制日志。其实除了数据复制外,它还可以实现数据恢复、增量备份等功能。
启动项目前,首先需要确保mysql
服务已经启用了binlog
:
show variables like 'log_bin';
如果为值为OFF
,表示没有启用,那么需要首先启用binlog
,修改配置文件:
log_bin=mysql-bin
binlog-format=ROW
server-id=1
对参数做一个简要说明:
-
在配置文件中加入了
log_bin
配置项后,表示启用了binlog
-
binl