【Binlog实战】:基于Spring监听Binlog日志

news2024/9/20 9:35:12

【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
    FROM
    	t_user
    WHERE
    	id = '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 查询语句或其他信息来确定操作的类型。

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

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

相关文章

Redis存储原理

前言 我们从redis服务谈起,redis是单reactor,命令在redis-server线程处理。还有若干读写IO线程负责IO操作(redis6.0之后,Redis之pipeline与事务)。此外还有一个内存池线程负责内存管理、一个后台文件线程负责大文件的关…

信息安全数学基础(17)Wilson定理

前言 Wilson定理(Wilsons Theorem)是数论中的一个基本定理,它揭示了素数与其阶乘之间的一个重要关系。 一、表述 对于任意素数p,有(p−1)!≡−1(modp),其中(p−1)!表示p−1的阶乘,即123⋯(p−1)。 这个定理…

C++STL~~priority_queue

文章目录 容器适配器一、priority_queue的概念二、priority_queue的使用三、priority_queue的练习四、仿函数五、总结 容器适配器 什么是适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将…

python画图|3D bar进阶探索

前述学习过程只能怪,已经探究了3D直方图的基础教程,详见下述链接: python画图|3D直方图基础教程-CSDN博客 实际上,基础文章直接进入了堆叠教程,相对来说基础的程度不够,因此有必要再次探索。 【1】官网教…

spug项目实现代码本地启动步骤

一、spug代码仓库地址: spug: 开源运维平台:面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布、任务计划、配置中心、监控、报警等一系列功能。 - Gitee.com 注意:如…

【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资

最终效果 文章目录 最终效果一、实现Windows消息弹窗二、将窗口扩展到工作区三、穿透能点击到其他区域四、模型交互1、我们可以新增ObjectDrag 代码控制人物拖拖动2、实现模型交互五、最终代码六、其他七、游玩地址使用Live2D实现桌宠七、源码参考完结一、实现Windows消息弹窗 …

jetson nano开发板安装todesk远程乌班图aarch版本

打开todesk官网,并打开Linux系统的一栏:ToDesk远程桌面软件-免费安全流畅的远程连接电脑手机 我这里选择deb安装包,然后安装依赖 sudo apt-get install libappindicator3-1 由于我下载上传到了根目录,所以直接在终端运行安装命令…

Golang | Leetcode Golang题解之第415题字符串相加

题目: 题解: func addStrings(num1 string, num2 string) string {add : 0ans : ""for i, j : len(num1) - 1, len(num2) - 1; i > 0 || j > 0 || add ! 0; i, j i - 1, j - 1 {var x, y intif i > 0 {x int(num1[i] - 0)}if j &g…

nonlocal本质讲解(前篇)——从滤波到Nonlocal均值滤波

线性滤波 → \rightarrow →高斯滤波 → \rightarrow →高斯滤波 → \rightarrow →双边滤波 → \rightarrow →Nonlocal均值滤波 平均 高斯 双边 Nonlocal 目录 线性滤波高斯滤波双边滤波Nonlocal均值滤波 滤波最初是频域的概念,由于频域乘积对应空域卷积&am…

Qwen2-VL环境搭建推理测试

引子 2024年8月30号,阿里推出Qwen2-VL,开源了2B/7B模型,处理任意分辨率图像无需分割成块。之前写了一篇Qwen-VL的博客,感兴趣的童鞋请移步(Qwen-VL环境搭建&推理测试-CSDN博客),这么小的模…

Spring Cloud Alibaba-(1)搭建项目环境

1.Spring Cloud Alibaba(官网:https://sca.aliyun.com/) Spring Cloud Alibaba 是阿里巴巴结合自身丰富的微服务实践而推出的微服务开发的一站式解决方案,是 Spring Cloud 第二代实现的主要组成部分。吸收了 Spring Cloud Netflix…

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

深入探究HTTP网络协议栈:互联网通信的基石

在我们日常使用互联网的过程中,HTTP(HyperText Transfer Protocol,超文本传输协议)扮演着至关重要的角色。无论是浏览网页、下载文件,还是进行在线购物,HTTP协议都在背后默默地支持着这些操作。今天&#x…

【隐私计算篇】中国剩余定理解释以及Paillier解密加速应用

1. 背景介绍 本篇主要关注中国剩余定理的原理以及在paillier同态加密系统中的应用。在很多工作中,都可以看到中国剩余定理的影子,特别是同态加密提升计算效率的优化工作中,将paillier与中国剩余定理进行结合,能够实现在加密状态下…

[产品管理-25]:NPDP新产品开发 - 23 - 产品创新中的市场调研 - 定量市场调研的常见工具

目录 前言: 一、问卷调查 二、消费者测评组 三、概念测试与概念分类 概念测试 概念分类 四、感官检验 1、定义与特点 2、基本方法 3、应用领域 4、优势与局限性 五、眼动追踪 1、技术原理 2、应用领域 3、技术优势 4、市场现状与发展趋势 5、结论 …

彩蛋岛 销冠大模型案例

彩蛋岛 销冠大模型案例 任务: https://kkgithub.com/InternLM/Tutorial/tree/camp3/docs/EasterEgg/StreamerSales 视频 https://www.bilibili.com/video/BV1f1421b7Du/?vd_source4ffecd6d839338c9390829e56a43ca8d 项目git地址: https://kkgithu…

设计模式-结构型-11-代理模式

文章目录 1. 基本介绍2. 静态代理2.1 基本介绍UML 类图 2.2 应用实例定义接口目标对象代理对象调用代理 2.3 静态代理优缺点 3. 动态代理3.1 基本介绍3.2 JDK 中生成代理对象的 API参数说明UML类图 3.3 应用实例定义接口目标对象代理工厂调用代理 4. Cglib 代理4.1 基本介绍4.2…

2011-2022年数字金融与企业ESG表现:效应、机制与“漂绿”检验(内含原始数据+处理代码)

2011-2022年数字金融与企业ESG表现:效应、机制与“漂绿”检验(内含原始数据处理代码) 1、时间:2011-2022年 2、来源:上市公司年报、华证ESG、北大数字普惠金融 3、指标:年份、股票代码、股票简称、行业名…

使用Maven创建一个Java项目并在repository中使用

JDK环境:1.8.0_371 Maven环境 :Apache Maven 3.6.3 配置完成jdk和mvn后,进入到指定文件夹下执行如下语句: mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…

Matlab Delany-Bazley和Miki模型预测多孔材料吸声性能

Delany-Bazley模型和Miki模型是常用于预测多孔材料吸声性能的两种模型。Delany-Bazley模型是一种经验模型,用于描述多孔材料的声学特性,特别是复杂多孔材料如泡沫材料。该模型基于材料的几何参数(如孔隙率、孔隙形状等)来预测材料…