背景
需要将数据库增量内容同步到另外的数据库,两者保持一致。包含增删改,数据库创建、删除,数据库名称修改,内容清空,表结构修改,索引创建、修改、删除。
方案
采用阿里巴巴Canal,用于监听mysql的bin-log日志,从中读取操作日志,然后写入目标库。
JDK需要自行安装,本人采用JDK1.8-64位。
(2)修改mysql配置文件my.inf(用的mysql5.7版本)
[mysqld]
log-bin=mysql-bin
binlog-format=ROW
server-id=123 # 自定义
binlog-do-db=test1 # 需要同步的数据库1
binlog-do-db=test2 # 需要同步的数据库2
binlog-do-db=test3 # 需要同步的数据库3
binlog-do-db=test4 # 需要同步的数据库4
binlog-ignore-db=mysql # 忽略的表
binlog-ignore-db=mysqlslap
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
expire_logs_days=3 # 自动清理3天前的log文件,可根据需要修改
max_binlog_size=100M # 参考https://www.cnblogs.com/MYSQLZOUQI/articles/3860938.html
注:mysql的bin-log文件一般在/var/lib/mysql下
重启mysql后可以在上述路径下看到 : mysql-bin.00001类似的文件。
如果文件误删,可以用FLUSH LOGS命令重新生成
(3)创建canal用户名与密码,并赋予权限
CREATE USER canal@'%' IDENTIFIED BY 'canal'; # %远程登录
GRANT ALL PRIVILEGES ON *.*TO 'canal'@'%' ; # 赋予canal所有权限
FLUSH PRIVILEGES;
show grants for 'canal' ; # 查看权限
说明 replication slave 允许读取主服务器上的二进制文件
创建完可以试着登录一下,并执行
ON代表成功开启
show variables like 'binlog_format';
show variables like 'log_bin';
show variables like '%server_id%';
GRANT Replication Slave ON . TO zhl_rcenter_v2@%;
(4)解压canal包
cd 安装包路径
mkdir /usr/local/canal
tar zxvf canal.deployer-1.1.4.tar.gz -C /usr/local/canal
(5)认识目录
bin: 存放启动,停止,重启的sh文件
conf: 存放配置文件
lib: 一些引用包
logs:日志文件
(6)配置
备份
cp ./conf/example/ 备份路径
对于每个实例进行配置:一个实例连接一个数据源,例如配置一个rcenter,一个dictionary
cp ./conf/example rcenter
cp ./conf/example dictionary
打开配置文件(rcenter)
vi ./conf/rcenter/instance.properties
修改部分信息
canal.instance.master.address=源数据库ip:3306
数据库用户名
canal.instance.dbUsername=【用户名】
数据库用密码
canal.instance.dbPassword=【密码】
默认数据库名称
canal.instance.defaultDatabaseName=zhl_rcenter_v2
打开配置文件(dictionary)
vi ./conf/dictionary/instance.properties
修改部分信息
canal.instance.master.address=源数据库ip:3306
数据库用户名
canal.instance.dbUsername=canal
数据库用密码
canal.instance.dbPassword=canal
默认数据库名称
canal.instance.defaultDatabaseName=zhl_dictionay
(7)启动canal
进入./conf 中
./startup.sh
查看logs中的日志是否成功
tail -f ./canal/canal.log
tail -f ./rcenter/rcenter.log
tail -f ./dictionary/dictionary.log
如果报错with command: show master status请看文后链接(一般来说都是权限不正确)
(8)编写客户端
见项目的application.yml
配置需要注意, 1. 每次增加实例需要配置目标数据源
2. canal.instance按格式配置
3. JdbcTemplateUtil类中配置excute切换数据源
4. SpringDatasourceConfig中配置数据源
(9)存在问题
如果与canal服务器断开连接,则进程挂掉。