当前位置: 首页 > news >正文

【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
    
  • 其中,statementrowmixed 分别代表 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 DATABASE test2023 CHARACTER 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 TABLE t_user(idbigint(20) NOT NULL AUTO_INCREMENT,userName varchar(100) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4,表示执行了在 test2023 数据库中创建名为 t_user 的表的操作。
    • 这个事件的作用是在 test2023 数据库中创建了一个名为 t_user 的表,该表包含 iduserName 两个字段,其中 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 INTO test2023.t_user (id, userName) VALUES ( "10086", "用心记录技术,走心分享,始于后端,不止于后端,励志成为一名优秀的全栈架构师,真正的实现码中致富。",表示执行了向 test2023 数据库的 t_user 表中插入一行数据
  • 这个事件的作用是向 t_user 表中插入了一行数据,包含了 iduserName 两个字段的值。这种类型的事件通常用于记录数据的变化,以便进行数据备份、同步和迁移等操作。

  • 在这里插入图片描述

  • 修改表数据

  • 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 查询为 UPDATE test2023.t_userSETid= '10086', userName = '我的修改数据!!!' WHERE (id = '10086'),表示执行了更新 test2023 数据库中的 t_user 表中一行数据的操作。
  • 这个事件的作用是将 t_user 表中 id10086 的行的数据进行更新,将 id 修改为 10086userName 修改为 ‘我的修改数据!!!’。这种类型的事件通常用于记录数据的变化,以便进行数据备份、同步和迁移等操作。

  • 在这里插入图片描述

  • 删除表数据

  • 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 表中 id10086 的行。这种类型的事件通常用于记录数据的删除操作,以便进行数据备份、同步和迁移等操作。

  • 在这里插入图片描述

  • 总结: 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 文献速递介绍 医学视觉问答&#xff08;VQA&#xff09;是医学多模态大语言模型&#xff08;LL…...

从入门到精通,带你探索适合新手的视频剪辑工具

用视频来分享生活已经变成越来越多人的一种习惯&#xff0c;很多时候视频并不能一镜到底&#xff0c;所以还需要一些的修改、剪辑操作&#xff0c;那么这次我将介绍几款视频剪辑工具&#xff0c;希望能够让你分享的道路更加通畅。 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环境中&#xff0c;远程管理和SSH连接已经成为管理员和开发者日常工作的重要组成部分。MobaXterm是一款功能强大的终端模拟器&#xff0c;它集成了多种网络工具&#xff0c;非常适合用于远程管理、编程和网络调试。本文将汇总一些MobaXterm的使用技巧&#xff0c…...

openstack中的rabbitmq

基本概念 基础介绍 exchange&#xff1a;用于分发信息&#xff0c;有direct、fanout、topic、headers&#xff1b; binding&#xff1a;exchange、queue之间的虚拟连接&#xff0c;由一个或者多个routing key组成&#xff1b; queues&#xff1a;用来暂存消息&#xff0c;供…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...