1.canal简介
canal可以用来监控数据库数据的变化,从而获得新增数据,或者修改的数据。
原理:
1. canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
3. canal解析binary log对象(原始为byte流)
2.环境部署
如果不想用mysql的用户,可以创建新用户
使用root账号创建用户并授予权限:
create user canal@'%' IDENTIFIED by 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT,SUPER ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
3.下载canal
4.解压(我是windows系统,同样也适用于linux系统)
5.修改 exmaple下的实例配置
6.指定读取位置
mysql -h localhost -u root -p
进入mysql中执行下面语句查看binlog所在位置
show master status;
如果file中binlog文件不为 mysql-bin.000001 可以重置mysql
reset master;
查看canal配置文件(找到对应的binlog信息更改一致即可):
7.启动canal服务(windows系统bat,linux是sh)
8.查看日志,如下图,表示启动成功
9.spring boot 添加依赖
<dependency>
<groupId>com.xpand</groupId>
<artifactId>starter-canal</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
10.启动类加注解
@EnableCanalClient //声明当前的服务是canal的客户端
11.yml或者properties文件添加配置
canal:
client:
instances:
example:
host: 127.0.0.1
port: 11111
canal.client.instances.example.host=127.0.0.1
canal.client.instances.example.port=11111
canal.client.instances.example.batchSize=1000
12.创建监听类
@CanalEventListener
public class BusinessListener {
/**
* @param eventType 当前操作数据库的类型
* @param rowData 当前操作数据库的数据
*/
@ListenPoint(schema = "cms", table = "cms_ad")
public void adUpdate(CanalEntry.EventType eventType, CanalEntry.RowData rowData) {
System.out.println("广告表数据发生改变");
//获取改变之前的数据
rowData.getBeforeColumnsList().forEach((c) -> System.out.println("改变前的数据:" + c.getName() + "::" + c.getValue()));
//获取改变之后的数据
rowData.getAfterColumnsList().forEach((c) -> System.out.println("改变之后的数据:" + c.getName() + "::" + c.getValue()));
}
}
13.启动服务,修改对应的数据库表内容,可以在控制台看到打印出来的信息