Java实现MySQL binlog日志监听
2022/1/23 2:04:32
本文主要是介绍Java实现MySQL binlog日志监听,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
使用案例
引入maven依赖
<dependency> <groupId>com.github.shyiko</groupId> <artifactId>mysql-binlog-connector-java</artifactId> <version>0.21.0</version> </dependency>
监听binlog实现
public class App { public static void main(String[] args) throws Exception { BinaryLogClient logClient = new BinaryLogClient( "127.0.0.1", 3306, "db", "root", "7654321" ); logClient.registerEventListener(event -> { EventData data = event.getData(); // 如果日志是更新记录 if(data instanceof UpdateRowsEventData){ long tableId = ((UpdateRowsEventData) data).getTableId(); System.out.println("update: " + tableId); }else if(data instanceof WriteRowsEventData){ long tableId = ((WriteRowsEventData) data).getTableId(); // 如果日志是写操作 System.out.println("write: " + tableId); }else if(data instanceof DeleteRowsEventData){ long tableId = ((DeleteRowsEventData) data).getTableId(); // 如果日志是删除操作 System.out.println("delete: " + tableId); } }); // 开始监听 logClient.connect(); } }
binlog中的table_id
- table_id 并不是固定的,它是当表被载入内存(table_definition_cache)时,临时分配的,是一个不断增长的变量。
- 当有新的table变更时,在cache中没有,就会触发一次load table def的操作,此时就会在原先最后一次table_id基础上+1,做为新的table def的id。
- flush tables,之后对表的更新操作也会触发table_id 的增长。
- 如果table def cache过小,就会出现频繁的换入换出,从而导致table_id增长比较快。
- 重启主库使table_id 归0。
- 同一张表的table_id也不是一直不变的,记住,这个东西不是表定义的东西,是操作表的东西。
table_id的意义
- 任何一个东西都有它的意义,table_id也一样,它的作用是联系频繁DML操作和表结构的纽带.被包含在binlog中的Table_map_event(用于描述表的内部ID和结构定义)
- 假如一个insert更新了10000条数据,那么对应的表结构信息是否需要记录10000次列?其实是对同一个表的操作,所以binlog只是记录了一个Table_map用于记录表结构相关信息,而后面的Write_rows记录了更新数据的行信息。他们之间是通过table_id来联系的。
- table_id用来做hash key,通过set_table(table_id)的方法将某个表的信息hash到cache中;又可以通过get_table()方法来根据table_id获得对应的表信息。
flush table
解释: 关闭所有已打开的表对象,同时将查询缓存中的结果清空。就是说Flush tables的一个效果就是会等待所有正在运行的SQL请求结束。
flush tables; flush table table1,table2...
binlog相关命令
-- 查询binglog日志列表 show binary logs; -- 查询第一个(最早)的binlog日志 show binlog events; -- 指定查询 mysql-bin.000077 日志 show binlog events in 'mysql-bin.000077'; -- 指定查询 mysql-bin.000077 日志,并且从pos=1024开始查 show binlog events in 'mysql-bin.000077' from 1024; -- 指定查询 mysql-bin.000077 日志,并且从pos=1024开始查起,查询10条 show binlog events in 'mysql-bin.000077' from 1024 limit 10; -- 指定查询 mysql-bin.000077 日志,并且从pos=1024开始查起,偏移2行,查询10条 show binlog events in 'mysql-bin.000077' from 1024 limit 2,10;
reference
-
mysql-binlog-connector-java
-
阿里巴巴 MySQL binlog 增量订阅&消费组件
-
mysql原理 ~ binlog系列之 table_id详谈
这篇关于Java实现MySQL binlog日志监听的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28微服务架构中API版本控制的实践
- 2024-09-28AI给的和自己写的Python代码,都无法改变输入框的内容,替换也不行
- 2024-09-27Sentinel配置限流资料:新手入门教程
- 2024-09-27Sentinel配置限流资料详解
- 2024-09-27Sentinel限流资料:新手入门教程
- 2024-09-26Sentinel限流资料入门详解
- 2024-09-26Springboot框架资料:初学者入门教程
- 2024-09-26Springboot框架资料详解:新手入门教程
- 2024-09-26Springboot企业级开发资料:新手入门指南
- 2024-09-26SpringBoot企业级开发资料新手指南