首页 > 数据库 >Java实现MySQL binlog日志监听

Java实现MySQL binlog日志监听

时间:2022-12-03 23:33:36浏览次数:64  
标签:binlog bin.000077 Java MySQL mysql table 日志 id


使用案例

引入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


标签:binlog,bin.000077,Java,MySQL,mysql,table,日志,id
From: https://blog.51cto.com/u_15891990/5908804

相关文章

  • mysql中的表不同类型怎么的长度
    一文搞懂字符和字节的含义(qq.com)一文搞懂MySQL的数据类型中长度的含义(qq.com)学习MYSQL要对字符类型跟长度有个明确的认识,我当初很容易搞错!这里重新学习一下......
  • mysql字符集utf8和utf8mb4的使用问题
    一、MySQL中length()、char_length()的区别和用法char_length(str)计算单位:字符不管汉字还是数字或者是字母都算是一个字符length(str)计算单位:字节utf8编码:一个汉字三个字......
  • Java8中Collectors求和功能的自定义扩展
    业务中需要将一组数据分类后收集总和,原本可以使用Collectors.summingInt(),但是我们的数据源是BigDecimal类型的,而Java8原生只提供了summingInt、summingLong、summingDouble......
  • java二维数组
    本文介绍java中二维数组的存放位置int[][]arr=newint[2][3];jvm存放二维数组的图示:下面介绍列数不明确的情况: 代码如下:publicclassTwo{publicsta......
  • [Javascript Performance] Optimisation and deoptimization
    Theoptimizingcompileroptimizesforwhatit’sseen.Ifitseessomethingnew,that’sproblematic. Seletingpropertieshassomestrangeimplicationsonpe......
  • 面试大厂 看这篇MySQL面试题就够了
    MySQL一直是面试中的热点问题,也难道了很多的面试者。其实MySQL没那么难,只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏......
  • [Javascript Performance] How to benchmark code performance
    Code:benchmark.jsconst{performance}=require('perf_hooks');//SETUP......
  • Jenkins+GitLab实现构建JAVA代码
    目录一、前置环境配置二、创建一个maven任务需要提前部署完成Jenkins+GitLab+maven可以参考我的其他文章进行部署一、前置环境配置1、安装MavenIntegration插件Jenki......
  • java中== 和equals的区别
    本文主要介绍==和equals的区别1.==比较的是地址,引用类型(除了String类)的时候,只要不是同一个对象,就不是同一个地址,String类型的时候,如果new出来两个对象,那么也是不同地......
  • mysql和sql server的区别是什么?
    https://blog.csdn.net/qq_51179608/article/details/124322292实际上,每个web应用程序和数据库都扮演着重要的角色。由于当前web开发的动态特性,即使是最基本的应用程序也......