嘿嘿 又知道多一点点 说来有些惭愧 现在才写 各方面因素造成的延迟
实时监控mysql表除了canal还有什么,还有很多,比如
mysql-binlog-connector-java
GitHub - liufeiit/mysql-binlog-connector-java: mysql-binlog-connector-java
java库,基于复制协议解析读取mysql二进制日志(实时订阅/消费)
自然canal还有这个client还有下面要提到都是需要开启binlog的show variables like 'log_bin';
log_bin=mysql-bin
binlog-format=ROW#格式 statement row mixed
server-id=1#sql从哪个server写入
<dependency>
<groupId>com.github.shyiko</groupId>
<artifactId>mysql-binlog-connector-java</artifactId>
<version>0.2.2</version>
</dependency>
binlog
row:仅保存被修改的细节,每一行数据的变化:前/后数据,被修改行的实际数据,不记录上下文
statement:记录每条会修改数据的sql语句和执行结果,执行语句 上下文环境,函数会有问题
mixed:混合简单的statement 复杂row,对于insert update delete的binlog事件类型=query事件
事件
query与数据库关,begin / drop table / truncate table
table_map:记录下一个操作对应的表信息
xid:标记事务提交
原理
- 创建BinaryLogClient,设置主机 port user password等必要参数
- 客户端连接mysql,发送dump请求,开始从指定位置发送日志事件,可指定日志的起始和结束位置,及需要订阅的事件类型、数据库名称或表名称等过滤条件
- BinaryLogClient接收到事件,解析转换为Java对象,尝试回调一个或多个事件监听器。每个监听器可以实现自己的逻辑,如将事件记录到文件、将事件写入队列或执行自定义代码等
-
应用程序可随时关闭客户端连接,MySQL将停止向客户端发送事件,并且客户端将在退出之前自动处理所有未处理的事件
write_rows插入数据 update_rows delete_rows 具体看代码,很清晰 但是也有点小问题 评论区指出吧大佬们!
这个执行起来很简单,主要的代码在下面了
建议宝贝直接debug看看参数,进方法里面看看源码 yyds
public static void main(String[] args) throws IOException {
/**
* BinaryLogClient 类是 MySQL 提供的一个底层使用了 MySQL 原生协议和通信机制的 Java 客户端,用于监听 MySQL 数据库的二进制日志(Binary Log),并实现实时的数据同步
*/
BinaryLogClient client = new BinaryLogClient("IP", 3306, "账号", "密码");
/**
* EventDeserializer 是一个接口,将 Event 数据从序列化格式反序列化为对象
*/
EventDeserializer eventDeserializer = new EventDeserializer();
eventDeserializer.setCompatibilityMode(
// 时间戳表示 自 Unix 纪元(1970 年 1 月 1 日 UTC)以来的毫秒数
EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG,
//通过使用字节数组来表示字符和二进制数据,保留其编码和格式信息
EventDeserializer
.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY
);
client.setEventDeserializer(eventDeserializer);
//serverId是一个客户端与MySQL实例之间的唯一标识符
//有多个客户端同时订阅同一个MySQL实例上的二进制日志,那么每个客户端的serverId应该是唯一的