当前位置: 首页 > 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;供…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...