【Binlog实战】:基于Spring监听Binlog日志
【Binlog实战】:基于Spring监听Binlog日志
binlog的三种模式
-
MySQL 的二进制日志(binlog)有三种不同的格式,通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。
-
Statement 模式:
- 在 Statement 模式下,MySQL 记录每个会更改数据的 SQL 语句。
- binlog 记录的是执行的 SQL 语句本身,而不是具体的数据变化。
- 例如,如果执行了
UPDATE语句,binlog 记录的是这个UPDATE语句的文本。
-
Row 模式:
- 在 Row 模式下,MySQL 记录每一行数据的变化。
- binlog 记录的是行数据的变化,而不是 SQL 语句。
- 例如,如果执行了
UPDATE语句,binlog 记录的是被修改的行的实际数据。
-
Mixed 模式:
- Mixed 模式是 Statement 模式和 Row 模式的结合。
- 在 Mixed 模式下,MySQL 根据执行的 SQL 语句的类型来决定是记录语句还是记录行。
- 通常,对于简单的语句,使用 Statement 模式,对于涉及到行变化的复杂语句,使用 Row 模式。
-
这些模式可以通过 MySQL 配置文件中的
binlog_format参数进行配置。例如: -
[mysqld] binlog_format=mixed -
其中,
statement、row和mixed分别代表 Statement 模式、Row 模式和 Mixed 模式。选择适当的 binlog 模式取决于应用的特定需求和性能要求。不同的模式具有不同的优劣势,例如,Statement 模式可能会更轻量,而 Row 模式可能提供更详细的数据变化信息。
以Mixed 为例
-
查看binlog是否开启
-
show variables like '%log_bin%' -

-
启动springboot程序
-

-
新建数据库
-

-
这个事件是一个 binlog 事件,其内容表示一个 SQL 查询事件。让我解释一下这个事件的各个部分:
- 事件类型 (***
eventType***): 该事件的类型是QUERY,表示这是一个 SQL 查询事件。 - 时间戳 (***
timestamp***): 事件的时间戳为1700045267000,表示事件发生的时间。 - 线程ID (***
threadId***): 线程ID 是189,表示执行这个查询的线程的标识符。 - 执行时间 (***
executionTime***): 执行时间为0,表示执行这个查询所花费的时间。 - 错误代码 (***
errorCode***): 错误代码为0,表示查询执行没有错误。 - 数据库 (***
database***): 数据库为test2023,表示这个查询发生在test2023数据库中。 - SQL 查询 (***
sql***): 实际的 SQL 查询为CREATE DATABASEtest2023CHARACTER SET utf8 COLLATE utf8_general_ci,表示执行了创建数据库的操作。 - 这个事件的作用是在
test2023数据库中执行了一个创建数据库的 SQL 查询。这是 binlog 中的一部分,用于记录数据库中的变化,以便进行数据备份、主从同步等操作。 
- 事件类型 (***
-
新建表数据
-
CREATE TABLE `t_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`userName` varchar(100) NOT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; -

-
这个事件也是一个 binlog 事件,表示一个 SQL 查询事件。让我解释一下这个事件的各个部分:
- 事件类型 (***
eventType***): 该事件的类型是QUERY,表示这是一个 SQL 查询事件。 - 时间戳 (***
timestamp***): 事件的时间戳为1700045422000,表示事件发生的时间。 - 线程ID (***
threadId***): 线程ID 是204,表示执行这个查询的线程的标识符。 - 执行时间 (***
executionTime***): 执行时间为0,表示执行这个查询所花费的时间。 - 错误代码 (***
errorCode***): 错误代码为0,表示查询执行没有错误。 - 数据库 (***
database***): 数据库为test2023,表示这个查询发生在test2023数据库中。 - SQL 查询 (***
sql***): 实际的 SQL 查询为CREATE TABLEt_user(idbigint(20) NOT NULL AUTO_INCREMENT,userNamevarchar(100) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4,表示执行了在test2023数据库中创建名为t_user的表的操作。 - 这个事件的作用是在
test2023数据库中创建了一个名为t_user的表,该表包含id和userName两个字段,其中id是自增的主键。这种类型的事件常常用于记录数据库结构的变化,以便进行数据备份、迁移和版本控制等操作。 
- 事件类型 (***
-
插入表数据
-
INSERT INTO `test2023`.`t_user` (`id`, `userName`) VALUES("10086","用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。"); -

-
这个事件也是一个 binlog 事件,表示一个 SQL 查询事件,具体如下:
- 事件类型 (***
eventType***): 该事件的类型是QUERY,表示这是一个 SQL 查询事件。 - 时间戳 (***
timestamp***): 事件的时间戳为1700045547000,表示事件发生的时间。 - 线程ID (***
threadId***): 线程ID 是204,表示执行这个查询的线程的标识符。 - 执行时间 (***
executionTime***): 执行时间为0,表示执行这个查询所花费的时间。 - 错误代码 (***
errorCode***): 错误代码为0,表示查询执行没有错误。 - 数据库 (***
database***): 数据库为test2023,表示这个查询发生在test2023数据库中。 - SQL 查询 (***
sql***): 实际的 SQL 查询为INSERT INTOtest2023.t_user(id,userName) VALUES ( "10086", "用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。",表示执行了向test2023数据库的t_user表中插入一行数据
- 事件类型 (***
-
这个事件的作用是向
t_user表中插入了一行数据,包含了id和userName两个字段的值。这种类型的事件通常用于记录数据的变化,以便进行数据备份、同步和迁移等操作。 -

-
修改表数据
-
UPDATE `test2023`.`t_user` SET `id` = '10086',`userName` = '我的修改数据!!!' WHERE(`id` = '10086'); -

-
这个事件同样是一个 binlog 事件,表示一个 SQL 查询事件,具体如下:
- 事件类型 (***
eventType***): 该事件的类型是QUERY,表示这是一个 SQL 查询事件。 - 时间戳 (***
timestamp***): 事件的时间戳为1700045675000,表示事件发生的时间。 - 线程ID (***
threadId***): 线程ID 是204,表示执行这个查询的线程的标识符。 - 执行时间 (***
executionTime***): 执行时间为0,表示执行这个查询所花费的时间。 - 错误代码 (***
errorCode***): 错误代码为0,表示查询执行没有错误。 - 数据库 (***
database***): 数据库为test2023,表示这个查询发生在test2023数据库中。 - SQL 查询 (***
sql***): 实际的 SQL 查询为UPDATEtest2023.t_userSETid= '10086',userName= '我的修改数据!!!' WHERE (id= '10086'),表示执行了更新test2023数据库中的t_user表中一行数据的操作。
- 事件类型 (***
-
这个事件的作用是将
t_user表中id为10086的行的数据进行更新,将id修改为10086,userName修改为 ‘我的修改数据!!!’。这种类型的事件通常用于记录数据的变化,以便进行数据备份、同步和迁移等操作。 -

-
删除表数据
-
DELETE FROMt_user WHEREid = '10086'; -

-
这个事件同样是一个 binlog 事件,表示一个 SQL 查询事件,具体如下:
- 事件类型 (***
eventType***): 该事件的类型是QUERY,表示这是一个 SQL 查询事件。 - 时间戳 (***
timestamp***): 事件的时间戳为1700045755000,表示事件发生的时间。 - 线程ID (***
threadId***): 线程ID 是204,表示执行这个查询的线程的标识符。 - 执行时间 (***
executionTime***): 执行时间为0,表示执行这个查询所花费的时间。 - 错误代码 (***
errorCode***): 错误代码为0,表示查询执行没有错误。 - 数据库 (***
database***): 数据库为test2023,表示这个查询发生在test2023数据库中。 - SQL 查询 (***
sql***): 实际的 SQL 查询为DELETE FROM t_user WHERE id = '10086',表示执行了删除test2023数据库中的t_user表中一行数据的操作。
- 事件类型 (***
-
这个事件的作用是删除
t_user表中id为10086的行。这种类型的事件通常用于记录数据的删除操作,以便进行数据备份、同步和迁移等操作。 -

-
总结: binlog_format 设置为 mixed 时,对于 INSERT、UPDATE 和 DELETE 操作,它们在 binlog 中的事件类型都会被表示为 QUERY 事件。这是因为在 mixed 模式下,MySQL 使用了不同的方式来记录不同类型的操作,但在 binlog 中,它们都被包装成了 QUERY 事件。
-
在 mixed 模式下:
- 对于某些语句级别的操作(例如非确定性的语句或不支持事务的存储引擎),会使用 STATEMENT 事件。
- 对于其他一些情况,会使用 ROW 事件,将变更的行作为事件的一部分进行记录。
-
这就是为什么看到的 INSERT、UPDATE 和 DELETE 操作的事件类型都是 QUERY。在处理这些事件时,需要根据具体的 SQL 查询语句或其他信息来确定操作的类型。
相关文章:
【Binlog实战】:基于Spring监听Binlog日志
【Binlog实战】:基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志(binlog)有三种不同的格式,通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式: 在 …...
鸿蒙OpenHarmony【轻量系统芯片移植】轻量系统STM32F407芯片移植案例
轻量系统STM32F407芯片移植案例 介绍基于STM32F407IGT6芯片在拓维信息[Niobe407]开发板上移植OpenHarmony LiteOS-M轻量系统,提供交通、工业领域开发板解决方案。移植架构采用Board与SoC分离方案,使用arm gcc工具链Newlib C库,实现了lwip、l…...
基于SpringBoot+定时任务实现地图上绘制车辆实时运动轨迹图
目录 1. 项目结构 2. Maven依赖配置 (pom.xml) 3. 实现后端服务 4. 配置文件 (application.properties) 5. 启动项目 6. 访问页面 实现基于北斗卫星的车辆定位和轨迹图的Maven工程(使用模拟数据),我们将使用以下技术: Spri…...
Rasa对话模型——做一个语言助手
1、Rasa模型 1.1 模型介绍 Rasa是一个用于构建对话 AI 的开源框架,主要用于开发聊天机器人和语音助手。Rasa 提供了自然语言理解(NLU)和对话管理(DM)功能,使开发者能够创建智能、交互式的对话系统。 1.2…...
golang学习笔记19——golang做服务发现与注册的深度剖析
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
ROS和ROS2借助智能大模型的学习和研究方法
机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还…...
弹性负载均衡ELB 详解和设置方法
一、弹性负载均衡ELB 详解 1. 定义与概念 弹性负载均衡(Elastic Load Balancing,简称ELB)是一种将访问流量自动分发到多台云服务器的流量分发控制服务。它通过在多个后端服务器之间均衡分配请求,提高应用程序的可用性、可扩展性…...
Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
文章目录 一、Scrapy 框架介绍1.1 数据流1.2 项目结构1.3 Scrapy 入门 二、Selector 解析器2.1 XPath 和 CSS 选择器2.2 信息提取2.3 正则提取 三、Spider 的使用3.1 Spider 运行流程3.2 Spider 类分析3.3 Request3.4 Response 四、Download Middleware 的使用4.1 process_requ…...
大众点评代发排名骗局
大众点评代发排名骗局 不诋毁同行,不贬低对手,请各位老板擦亮眼睛,认真看完这篇文章,以防上当受骗#网络宣传#企业推广#企业推广 大众点评代发排名:一场精心编织的骗局 在这个美食如云的时代&…...
硬件基础知识
驱动开发分为:裸机驱动、linux驱动 嵌入式:以计算机技术为基础,软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元:vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc(cpu&…...
使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码
使用gitee如何回滚上一个版本,简单操作方式-gitee自带功能无需使用代码,很多朋友使用代码的话容易出错,gitee自带了本功能: 找到gitee代码仓库,找到对应的想要回滚的版本点击进去 点击revert,选择自己对应的…...
独立站技能树之建站33项自检清单 1.0丨出海笔记
很多时候大家建好站之后很嗨,但过一会就开始担忧各种纠结我是不是还有什么点没做好,或者我的站漏了什么东西,那么接下来以下这个独立站自检清单能很好的帮到你。其实对于新手我还是建议大家直接用一些模板,因为模板上面基本该有的…...
js进阶-作用域是什么
经过前面80多篇文章对js相关内容的讲解,相信大家对js这门语言已经有了一定的知识储备,也掌握了这门语言的相关特性,领会到这门语言的魅力所在,所以从今天开始,会定期更新js进阶相关知识,大家可以持续关注&a…...
ant-design表格自动合并相同内容的单元格
表格自动合并相同内容的单元格 合并hooks import { TableColumnProps } from antdexport const useAutoMergeTableCell <T extends object>(dataSource: Array<T>,columns: Array<TableColumnProps> | Array<keyof T> ): Map<keyof T, Array<…...
通过多模态关系图学习实现可解释的医学图像视觉问答|文献速递--Transformer架构在医学影像分析中的应用
Title 题目 Interpretable medical image Visual Question Answering via multi-modal relationship graph learning 通过多模态关系图学习实现可解释的医学图像视觉问答。 01 文献速递介绍 医学视觉问答(VQA)是医学多模态大语言模型(LL…...
从入门到精通,带你探索适合新手的视频剪辑工具
用视频来分享生活已经变成越来越多人的一种习惯,很多时候视频并不能一镜到底,所以还需要一些的修改、剪辑操作,那么这次我将介绍几款视频剪辑工具,希望能够让你分享的道路更加通畅。 1.FOXIT视频剪辑 连接直达>>https://w…...
线性规划------ + 案例 + Python源码求解(见文中)
目录 一、代数模型(Algebraic Models)详解1.1什么是代数模型?1.2代数模型的基本形式1.3 安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例 1:市场供需平衡模型Python求解代码Python求解结果如下图:案例 2:运输问题中的线性规划模型进行数学建模分析1. 目标函…...
用Java实现人工智能
用Java实现人工智能 #Java #人工智能 #AI #机器学习 #深度学习 #数据科学 #技术博客 #编程技巧 文章目录 前言环境准备1. 安装Java2. IDE选择3. 依赖管理 数据准备模型训练模型评估分类模型评估回归模型评估模型的交叉验证 模型部署部署模型的基本步骤模型保存与加载Docker容器…...
MobaXterm使用技巧
引言 在现代IT环境中,远程管理和SSH连接已经成为管理员和开发者日常工作的重要组成部分。MobaXterm是一款功能强大的终端模拟器,它集成了多种网络工具,非常适合用于远程管理、编程和网络调试。本文将汇总一些MobaXterm的使用技巧,…...
openstack中的rabbitmq
基本概念 基础介绍 exchange:用于分发信息,有direct、fanout、topic、headers; binding:exchange、queue之间的虚拟连接,由一个或者多个routing key组成; queues:用来暂存消息,供…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
