canal
MySQL二进制文件
作用:1.主从复制 2.数据恢复 类别:1.二进制日志索引文件(文件后缀.index)记录所有操作 2.二进制日志文件记录不含查询的语句事件
MySQL二进制文件binlog
分类:1.statement 语句级别 记录每一次语句 优点:节省空间 缺点:有可能造成数据不一致性(可能使用时间函数随机函数造成数据不一致) 2.row 行级别 记录每一次结果 优点数据绝对一致性 缺点占用空间(一条sql影响多条数据改变) 3.mixed 默认走statement 特殊情况走row 但还是可能会产生数据不一致性
MySQL主从复制的步骤
1.Master主库将改变记录,写到二进制日志(binary log)中
2.Slave从库向mysql master发送dump协议,将master主库的binary log events拷贝到它的中继日志(relay log);
3.Slave从库读取并重做中继日志中的事件,将改变的数据同步到自己的数据库。
canal伪装Slave 从Master获取数据
搭建Canal
开启mysql
将下面配置写入 /etc/my.cnf
# 打开binlog log-bin=mysql-bin # 选择ROW(行)模式 binlog-format=ROW # 配置MySQL replaction需要定义,不要和canal的slaveId重复 server_id=1
canal配置
canal.properties不用动
conf/example/instance.properties照下面修改
canal.instance.mysql.slaveId=0 #与/etc/my.cnf的server_id不一致
canal.instance.dbUsername=canal #配置mysql用户名拥有读权限就行了 canal.instance.dbPassword=canal #配置mysql用户密码
下图为canal抓取信息的内容形式
canal集成springboot
gav
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
application.yml
canal:
server: 自己的canal地址:11111
destination: example
logging:
level:
root: info
top:
javatool:
canal:
client:
client:
AbstractCanalClient: error
实体类
import lombok.Data;
@Data
public class A {
private Integer a;
}
监听端实现
import com.example.cannal.pojo.A;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;
/**
* @author Ct
*/
@Slf4j
@Component
@CanalTable(value = "a") //表名
public class OrderaInfoHandler implements EntryHandler<A> {//A为自定义接收封装的类型 不能含有基本数据类型
@Override
public void insert(A a) {
System.out.println(a.getA());
log.info("当有数据插入的时候会触发这个方法");
}
@Override
public void update(A before, A after) {
log.info("当有数据更新的时候会触发这个方法");
}
@Override
public void delete(A t) {
log.info("当有数据删除的时候会触发这个方法");
}
}