Java 监听Mysql binlog

使用 mysql-binlog-connector-java

1. mysql-binlog-connector-java 官网
2. Java代码中,如何监控Mysql的binlog?

前置条件

1. mysql服务器表结构
CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`age` int NOT NULL,`code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2. 开启master的mysql 服务器的log_bin
show variables like 'log_bin';

log-bin状态
如果没有,那么设置文件中增加配置

log_bin=mysql-bin
binlog-format=ROW
server-id=1

重启服务

  • 在配置文件中加入了log_bin配置项后,表示启用了binlog
  • binlog-format是binlog的日志格式,支持三种类型,分别是STATEMENT、ROW、MIXED,我们在这里使用ROW模式
  • server-id用于标识一个sql语句是从哪一个server写入的,这里一定要进行设置,否则我们在后面的代码中会无法正常监听到事件

引入maven依赖

<dependency><groupId>com.zendesk</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.25.0</version>
</dependency>

代码块实现监听

查看一个简单的case

public static void main(String[] args) {// 这里的账号必须要有权限访问BinaryLogClient client = new BinaryLogClient("127.0.0.1", 3306, "root", "root");// 反序列化配置EventDeserializer eventDeserializer = new EventDeserializer();eventDeserializer.setCompatibilityMode(EventDeserializer.CompatibilityMode.DATE_AND_TIME_AS_LONG
//                EventDeserializer.CompatibilityMode.CHAR_AND_BINARY_AS_BYTE_ARRAY);// 设置反序列化配置client.setEventDeserializer(eventDeserializer);// 设置自己的client作为服务器的idclient.setServerId(3);// 可选,设置start fileName+position
//        client.setBinlogFilename("master-bin.000080");
//        client.setBinlogPosition(219);client.registerEventListener(event -> {EventData data = event.getData();String tableName;if (data instanceof TableMapEventData) {System.out.println("Table:");TableMapEventData tableMapEventData = (TableMapEventData) data;System.out.println(tableMapEventData.getTableId() + ": [" + tableMapEventData.getDatabase() + "." + tableMapEventData.getTable() + "]");tableName = tableMapEventData.getTable();// 如果是不处理的表,那么返回if (!Objects.equals(tableName, "student"))return;}if (data instanceof UpdateRowsEventData) {
//                System.out.println("Update:");
//                System.out.println(data);// 获取对应的操作对象的json化数据UpdateRowsEventData udata = (UpdateRowsEventData) data;List<Map.Entry<Serializable[], Serializable[]>> rows = udata.getRows();for (Map.Entry<Serializable[], Serializable[]> row : rows) {List<Serializable> entries = Arrays.asList(row.getValue());JSONObject dataObject = getDataObject(entries);System.out.println(dataObject);}} else if (data instanceof WriteRowsEventData) {WriteRowsEventData wData = new WriteRowsEventData();wData.getIncludedColumns();wData.getRows();System.out.println("Insert:");System.out.println(data);} else if (data instanceof DeleteRowsEventData) {System.out.println("Delete:");System.out.println(data);}});try {client.connect();} catch (IOException e) {e.printStackTrace();}}/*** 根据message获取对象*/private static JSONObject getDataObject(List<Serializable> message) {JSONObject resultObject = new JSONObject();String format = "{\"id\":\"0\",\"name\":\"1\",\"age\":\"2\",\"code\":\"3\"}";JSONObject json = JSON.parseObject(format);for (String key : json.keySet()) {resultObject.put(key, message.get(json.getInteger(key)));}return resultObject;}

首先,创建一个BinaryLogClient客户端对象,初始化时需要传入mysql的连接信息,创建完成后,给客户端注册一个监听器,来实现它对binlog的监听和解析。在监听器中,我们暂时只对4种类型的事件数据进行了处理,除了WriteRowsEventData、DeleteRowsEventData、UpdateRowsEventData对应增删改操作类型的事件数据外,还有一个TableMapEventData类型的数据,包含了表的对应关系,在后面的例子中再具体说明。
在这里,客户端监听到的是数据库级别的所有事件,并且可以监听到表的DML语句和DDL语句,所以我们只需要处理我们关心的事件数据就行,否则会收到大量的冗余数据。

启动程序,控制台输出:
在这里插入图片描述

我们需要知道表的信息或者的行信息,在反序列化的过程中,我们调用UpdateRowsEventData中只有行的index,而没有name,那么这个时候需要我们自己定义每列对应的续好了,然后解析获取到的row的信息。
在这里插入图片描述
方法如:

private static JSONObject getDataObject(List<Serializable> message) {JSONObject resultObject = new JSONObject();String format = "{\"id\":\"0\",\"name\":\"1\",\"age\":\"2\",\"code\":\"3\"}";JSONObject json = JSON.parseObject(format);for (String key : json.keySet()) {resultObject.put(key, message.get(json.getInteger(key)));}return resultObject;}

表和列信息模板

在getDataObject中,我们需要知道每个cloumnId对应的name,那么,我们需要自定义一个format,但是columnId和index的关系我们可以从information_schema中获取,当然,这就需要处理了,这里另说。
在这里插入图片描述

指定binlog的起始位置

By default, BinaryLogClient starts from the current (at the time of connect) master binlog position. If you wish to kick off from a specific filename or position, use client.setBinlogFilename(filename) + client.setBinlogPosition(position).

通常来说,监听从启动开始,但是也可以指定fileName+position

// 可选,设置start fileName+position,后续的话会都会开始执行的,包括后续的binlog file
client.setBinlogFilename("master-bin.000079");
client.setBinlogPosition(4);

查找binLog中的信息

参考:MySQL Binlog二进制日志基于position位置点恢复数据

如果无法确定启动的bin文件和postion,可以查看相关的binlog 文件,

查找binlog的文件名

查看master-server的配置文件,查看目录和文件前缀 mysql.ini
在这里插入图片描述
在目录下查找对应的binLog文件

在这里插入图片描述

查看binlong文件中的信息

show binlog events in 'master-bin.000080';

在这里插入图片描述

总结

1. git代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/22005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA的实用快捷键大全

目录 1.常规快捷键 1.1通用类 1.2注释类 1.3操作类 1.4展开与关闭 2.智能补全类快捷键 3.程序结构类快捷键 4.统一操作快捷键 1.常规快捷键 1.1通用类 像 Ctrl C 复制&#xff0c; Ctrl V 粘贴&#xff0c; Ctrl S保存文件&#xff0c; Ctrl X剪切&#xff0c;这种…

idea 2023 新版ui中git的相关操作

前两个月换了新电脑&#xff0c;下了最新版的idea发现可以切换一套新的ui了 切换新ui肯定不太习惯&#xff0c;很多操作都得重新摸索一下 在这里记录几个git相关的操作 忽略我下面截图中当前项目是js的后端项目…… 切换ui 首先说一下怎么切换新旧版ui&#xff0c;我这里就…

LeetCode每日一题Day5——21. 合并两个有序链表

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f433;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; …

3ds Max如何进行合成的反射光泽通道渲染

推荐&#xff1a; NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 准备场景 步骤 1 打开 3ds Max。smart_phone.max打开已 随教程提供。 打开 3ds Max 步骤 2 按 M 打开材质编辑器。选择空材料 槽。单击漫射通道。它将打开材质/贴图浏览器窗口。选择位图&#xff0…

ffmpeg安装

简介 FFmpeg是一个开源的音视频处理库&#xff0c;它提供了一系列的工具和API&#xff0c;可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作&#xff0c;比如转码、剪辑、合并等。FFmpeg的命令格式通常是&#xff1a;ffmpeg [全局选项] {[输入文…

Hum Brain Mapp:用于功能连接体指纹识别和认知状态解码的高精度机器学习技术

摘要 人脑是一个复杂的网络&#xff0c;由功能和解剖上相互连接的脑区组成。越来越多的研究表明&#xff0c;对脑网络的实证估计可能有助于发现疾病和认知状态的生物标志物。然而&#xff0c;实现这一目标的先决条件是脑网络还必须是个体的可靠标记。在这里&#xff0c;本研究…

性能优化-react路由懒加载和组件懒加载

背景 随着项目越来越大&#xff0c;打包后的包体积也越来越大&#xff0c;严重影响了首屏加载速度&#xff0c;需要对路由和组件做懒加载处理 主要用到了react中的lazy和Suspense。 废话不多说&#xff0c;直接上干货 路由懒加载 核心代码 import React, { lazy, Suspens…

GPS/北斗RTK差分定位系统的原理以及应用领域

导语&#xff1a;现代定位技术在国内外的发展与应用越来越广泛&#xff0c;其中GPS和北斗是两大被广泛使用的全球卫星定位系统。本文将介绍GPS/北斗RTK差分定位系统的原理以及其在各个领域的应用。 一、GPS/北斗RTK差分定位系统的原理 GPS/北斗RTK差分定位系统&#xff0c;即全…

【TypeScript】安装的坑!

TypeScript安装 安装TypeScript安装时候可能报错这样开头的数据&#xff08;无法枚举容器中的对象&#xff09;——原因&#xff1a;没权限先解决没权限的问题如果发现无法修改-高级-修改继续安装想使用tsc-发现&#xff0c;tsc不能用解决方法&#xff1a;配置环境变量最后的最…

便捷省心的手机直播影视工具,畅享轻松电视娱乐时光

便捷省心的手机直播影视工具&#xff0c;畅享轻松电视娱乐时光 在快节奏的现代生活中&#xff0c;我们常常渴望能够以简单、省心的方式消遣自己&#xff0c;享受高品质的电视娱乐。幸运的是&#xff0c;随着技术的进步&#xff0c;便捷省心的手机直播影视工具应运而生。这些工…

Adaptive autosar 都有哪些模块?各有什么功能?

Adaptive autosar是一种用于高性能计算ECU的软件平台,它支持自适应应用程序的开发和运行。它由两部分组成:基础(Foundation)和服务(Service)。基础包括了操作系统接口、执行管理、网络管理、识别访问管理、加密、更新和配置管理等功能。服务包括了通信管理、RESTful、时间…

【目标检测论文解读复现NO.33】改进YOLOv5的新能源电池集流盘缺陷检测方法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Kubernetes v1.20 二进制部署

架构 k8s集群master01&#xff1a;192.168.80.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.80.102 k8s集群node01&#xff1a;192.168.80.103 kubelet kube-proxy docker k8s集群node02&#xff1a;192.168.80…

后端整理(MySql)

1 事务 1.1 事务ACID原则 原子性&#xff08;Atomicity&#xff09; 事务的原子性指的是事务的操作&#xff0c;要么全部成功&#xff0c;要么全部失败回滚 一致性&#xff08;Consistency&#xff09; 事务的一致性是指事务必须使数据库从一个一致状态转变成另一个一致性…

使用kubeadm快速部署一个k8s集群

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

JVM之垃圾回收器

1.如何判断对象可以回收 1.1 引用计数法 什么是引用计数器法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 …

【C语言学习】整数范围、整数越界、无符号数

1.整数范围 对于一个字节&#xff08;8位&#xff09;&#xff0c;可以表达的范围是00000000 ~ 11111111 其中00000000 ——> 0 11111111 ~ 10000000 ——> -1 ~ -128&#xff08;从大到小&#xff09; 00000001 ~ 01111111 ——> 1~127&#xff08;从小到大&#xff…

电脑第一次使用屏幕键盘

操作流程 1.在键盘上同时按WinR打开运行; 2.输入control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步

《Kali渗透基础》13. 无线渗透(三)

kali渗透 1&#xff1a;无线通信过程1.1&#xff1a;Open 认证1.2&#xff1a;PSK 认证1.3&#xff1a;关联请求 2&#xff1a;加密2.1&#xff1a;Open 无加密网络2.2&#xff1a;WEP 加密系统2.3&#xff1a;WPA 安全系统2.3.1&#xff1a;WPA12.3.2&#xff1a;WPA2 3&#…

Springboot 多数据源 dynamic-datasource动态添加移除数据源

0.前言 上一篇文章我们讲了如何通过多数据源组件&#xff0c;在Spring boot Druid 连接池项目中配置多数据源&#xff0c;并且通过DS注解的方式切换数据源&#xff0c;《Spring Boot 配置多数据源【最简单的方式】》。但是在多租户的业务场景中&#xff0c;我们通常需要手动的…