MySQL 核心模块揭秘 | 06 期 | 事务提交之前,binlog 写到哪里?

news2024/12/23 23:18:15

在这里插入图片描述

1. 准备工作

参数配置:

binlog_format = ROW
binlog_rows_query_log_events = OFF

创建测试表:

CREATE TABLE `t_binlog` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `i1` int DEFAULT '0',
  `str1` varchar(32) DEFAULT '',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

示例 SQL:

BEGIN;

INSERT INTO `t_binlog` (`i1`, `str1`)
VALUES (100, 'MySQL 核心模块揭秘');

COMMIT;

2. 解析 binlog

执行示例 SQL 之后,我们可以用下面的命令解析事务产生的 binlog 日志:

cd <binlog 日志文件目录>

mysqlbinlog binlog.000395 \
  --base64-output=decode-rows -vv

解析 binlog 日志之后,我们可以得到 4 个 binlog event。

按照这些 binlog event 在 binlog 日志文件中的顺序,简化之后的内容如下:

  • Query_log_event
# at 1233
# Query	thread_id=8
BEGIN
  • Table_map_log_event
# at 1308
Table_map: `test`.`t_binlog` mapped to number 95
  • Write_rows_log_event
# at 1369
Write_rows: table id 95 flags: STMT_END_F
INSERT INTO `test`.`t_binlog`
SET
  @1=1 /* INT meta=0 nullable=0 is_null=0 */
  @2=100 /* INT meta=0 nullable=1 is_null=0 */
  @3='MySQL 核心模块揭秘' /* VARSTRING(96) meta=96 nullable=1 is_null=0 */
  • Xid_log_event
# at 1438
Xid = 32
COMMIT/*!*/;

示例 SQL 中,只有两条 SQL 会产生 binlog event:

  • BEGIN:不会产生 binlog event。
  • INSERT:产生三个 binlog event。
    • Query_log_event。
    • Table_map_log_event。
    • Write_rows_log_event。
  • COMMIT:产生 Xid_log_event。

3. binlog cache

我们使用 mysqlbinlog 分析 binlog 日志的时候,可以发现这么一个现象:同一个事务产生的 binlog event,在 binlog 日志文件中是连续的。

保证同一个事务的 binlog event 在 binlog 日志文件中的连续性,不管是 MySQL 从库回放 binlog,还是作为用户的我们,都可以很方便的定位到一个事务的 binlog 从哪里开始,到哪里结束。

一个事务会产生多个 binlog event,很多个事务同时执行,怎么保证同一个事务产生的 binlog event 写入到 binlog 日志文件中是连续的?

这就是 cache 发挥用武之地的时候了,每个事务都有两个 binlog cache:

  • stmt_cache:改变(插入、更新、删除)不支持事务的表,产生的 binlog event,临时存放在这里。
  • trx_cache:改变(插入、更新、删除)支持事务的表,产生的 binlog event,临时存放在这里。

因为我们只介绍 InnoDB 存储引擎,后面会忽略 stmt_cache,直接介绍 trx_cache。

事务执行过程中,产生的所有 binlog event,都会先写入 trx_cache。trx_cache 分为两级:

  • 第一级:内存,也称为 buffer,它的大小用 buffer_length 表示,由系统变量 binlog_cache_size 控制,默认为 32K。
  • 第二级:临时文件,位于操作系统的 tmp 目录下,文件名以 ML 开头。

buffer_length 加上临时文件中已经写入的 binlog 占用的字节数,也有一个上限,由系统变量 max_binlog_cache_size 控制。

4. 产生 binlog

如果一条 SQL 语句改变了(插入、更新、删除)表中的数据,server 层会为这条 SQL 语句产生一个包含表名和表 ID 的 Table_map_log_event

每次调用存储引擎的方法写入一条记录到表中之后,server 层都会为这条记录产生 binlog。

这里没有写成 binlog event,是因为记录中各字段内容都很少的时候,多条记录可以共享同一个 binlog event ,并不需要为每条记录都产生一个新的 binlog event。

多条记录产生的 binlog 共享同一个 binlog event 时,这个 binlog event 最多可以存放多少字节的内容,由系统变量 binlog_row_event_max_size 控制,默认为 8192 字节。

如果一条记录产生的 binlog 超过了 8192 字节,它的 binlog 会独享一个 binlog event,这个 binlog event 的大小就不受系统变量 binlog_row_event_max_size 控制了。

在 binlog 日志文件中,Table_map_log_event 位于 SQL 语句改变表中数据产生的 binlog event 之前。

示例 SQL 对应的事务中,INSERT 是改变表中数据的第一条 SQL 语句,它插入第一条(也是唯一一条)记录到 t_binlog 表之后,server 层会为这条记录产生 binlog event。

插入记录对应的 binlog event 是 Write_rows_log_event

产生 Write_rows_log_event 之前,server 层会先为 INSERT 构造一个 Table_map_log_event

构造 Table_map_log_event 之前,server 层发现一个问题:示例 SQL 对应的事务,还没有初始化 binlog cache。

那么,第一步就要为这个事务初始化 binlog cache,包括 stmt_cache 和 trx_cache。初始化完成之后,这两个 cache 都是空的。

在 binlog 日志文件中,一个事务以内容为 BEGIN 的 Query_log_event 开始。

刚刚初始化完成的 trx_cache 是空的,写入其它 binlog event 之前,要先写入一个内容为 BEGIN 的 Query_log_event。

写入 Query_log_event 之后,就可以写入内容为表名和表 ID 的 Table_map_log_event 了。

写入 Table_map_log_event 之后,接下来写入的 binlog event 就是包含插入记录所有字段的 Write_rows_log_event 了。

最后,执行 COMMIT 语句时,会产生内容为 COMMITXid_log_event,并写入 trx_cache。

5. 怎么写入 trx_cache?

事务执行过程中,所有 binlog event 都会先写入 trx_cache 的 buffer,buffer 大小默认为 32K。

如果 buffer 剩余空间不够写入一个 binlog event,buffer 和临时文件怎么协同合作,来完成这个 binlog event 的写入操作?

接下来,我们就来聊聊,写入一个 binlog event 到 trx_cache 的流程:

  • 判断 buffer 剩余空间是否足够写入这个 binlog event。
  • 如果足够,直接把 binlog event 写入 buffer,流程结束。
  • 如果不够,用 binlog event 前面的部分内容填满 buffer,然后,把 buffer 中所有内容写入临时文件,再清空 buffer,以备复用。
  • 接着判断 binlog event 剩余内容是否大于等于 4096 字节(IO_SIZE)。
  • 如果剩余内容大于等于 4096 字节,则把剩余内容前面的 N * 4096 字节写入临时文件。
    对于剩余内容字节数不能被 4096 整除的情况,最后还会剩下不足 4096 字节的内容,这部分内容会写入 buffer。
  • 如果剩余内容小于 4096 字节,直接把 binlog event 中剩余的所有内容都写入 buffer。

6. 总结

trx_cache 分为两级:内存(buffer)、临时文件。

事务执行过程中,产生的所有 binlog event 都要写入 trx_cache。

binlog event 写入 trx_cache,通常情况下,都会先写入 buffer,写满 buffer 之后,再把 buffer 中所有内容都写入临时文件,最后清空 buffer。

本期问题:如果 buffer 是空的,接下来要写入一个 86K 的 binlog event 到 trx_cache,写入流程是什么样的?欢迎大家留言交流。

下期预告:MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

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

相关文章

使用 Nuxt 构建简单后端接口及数据库数据请求

写在前面 本文主要为大家介绍&#xff0c;如何使用 Nuxt 框架实现一个简单的后端接口&#xff0c;并且从数据库中请求数据返回给前端。 实现 创建 serverMiddleware 文件夹 首先我们新建一个名字为 serverMiddleware 文件夹用来存储接口相关信息 目录结构如下&#xff1a;…

探索 JavaScript ES8 中的函数式编程并通过实例加以实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 介绍 函数式编程是一种强大的范式&#xff0c…

【buuctf--outguess】

看题目就知道应该要用到 outguess 这个工具了&#xff0c;具体用处和下载方式请参照这篇博客Outguess下载和使用方法_outguess工具-CSDN博客 下载的 tar 压缩包解压&#xff0c;huhuhu.zip是伪加密的&#xff0c;直接用 binwalk -e 提取一下就可以&#xff0c;也可以修改压缩源…

python游戏代码大全可复制,python基础游戏代码

本篇文章给大家谈谈python游戏编程入门游戏代码&#xff0c;以及python游戏代码大全可复制&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 仅限技术学习参考 分享13个游戏源码&#xff0c;可以自己复现玩玩&#xff0c;研究下里面的编程逻辑&#xff0c;对学…

PMP考试难度怎么样?

PMP考试整体难度并不大&#xff0c;因为目前的考试题型都是选择题&#xff0c;所以通过率相对较高。然而&#xff0c;新考纲中增加了更多关于敏捷方法的题型&#xff0c;这些题目相对更加变化多样&#xff0c;也有不少考生觉得难以抉择&#xff0c;四个选项都似乎都是正确的。P…

电商数据采集+跨境电商|API电商数据采集接口洞悉数字新零售发展

随着全球经济一体化和电子商务的快速发展&#xff0c;网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下&#xff0c;企业不仅要加大经营力度&#xff0c;还要在自己的基础设施和技术上持续投入&#xff0c;才能更好的适应市场和消费习惯。…

开源CMS Drupal本地快速部署并实现无公网ip环境远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

TP4366 1A 低成本 天源 同步移动电源方案 SOP-8

描述 TP4366是一款专为移动电源设计的同步升压的单芯片解决方案,内部集成了线性充电管理模块、同步放电管理模块、电量检测与LED指示模块、保护模块。TP4366内置充电与放电功率MOS,充电电流固定为0.8A,同步升压支持1A 输出电流。TP4366内部集成了温度补偿、过温保护、过充与过…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 二、子查询的使用 三、总结 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 在一个 select 语句中,嵌入了另外一个 select …

数据结构与算法:栈

朋友们大家好啊&#xff0c;在链表的讲解过后&#xff0c;我们本节内容来介绍一个特殊的线性表&#xff1a;栈&#xff0c;在讲解后也会以例题来加深对本节内容的理解 栈 栈的介绍栈进出栈的变化形式 栈的顺序存储结构的有关操作栈的结构定义与初始化压栈操作出栈操作获取栈顶元…

基于springboot实现的音乐网站

一、系统架构 前端&#xff1a;html | js | css | bootstrap 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 用户注册 03. 首页 04. 喜欢 05. 查询

以程序员的视角,看前后端分离的是否必要?

Hello&#xff0c;我是贝格前端工场&#xff0c;本篇分享一个老生常谈的话题&#xff0c;前后端分离是必然趋势&#xff0c;但也是要区分具体的场景&#xff0c;欢迎探讨&#xff0c;关注&#xff0c;有前端开发需求可以私信我&#xff0c;上车了。 一、什么是前后端分离和不分…

【dc-dc】世微AP5125 外置MOS 5-100V 8A平均电流型LED降压恒流驱动器 SOT23-6

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式&#xff0c; 利用平均电流检测模式&#xff0c;因此具有优异的负载调整 率特…

一种简单高效的新算法(2021)|算术优化算法AOA原理及其利用 (Matlab/Python)

文章来源于我的个人公众号&#xff1a;KAU的云实验台&#xff0c;主要更新智能优化算法的原理、应用、改进 CEC2005中的测试 本文KAU将介绍一个由Abualigah等人于2021年发表在Comput. Methods Appl. Mech. Eng.上的元启发式算法——算术优化算法(Arithmetic Optimization Al…

书生·浦语大模型实战营-第三课笔记

1、langchain工作流程 2、数据收集及向量化处理 数据收集是向量数据库的源头&#xff0c;可以理解为后续我们要长期采集和更新的知识库或者数据源&#xff0c;在本课中采用了几个项目中的txt和md文档作为数据源 3、接入langchain

搜索专项---DFS之连通性模型

文章目录 迷宫红与黑 一、迷宫OJ链接 本题思路:DFS直接搜即可。 #include <iostream> #include <cstring> #include <algorithm>constexpr int N110;int n; char g[N][N]; bool st[N][N]; int x1, y1, x2, y2;int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, …

如何复制IDEA中的提示?

在idea中&#xff0c;例如下面的提示我使用ctrl c怎么都复制不了&#xff0c;其实是有窍门的。 窍门很简单&#xff1a; 首先先把光标移动到提示框内&#xff0c;然后用alt 鼠标左键复制&#xff0c;提示框会自动关闭&#xff0c;这时就已经复制成功了&#xff01;&#xff…

ARM处理器运行Windows系统的三防加固平板|亿道三防

大家好&#xff01;今天我要为大家介绍一款引人注目的三防加固平板电脑——亿道三防系列产品。它们采用高通ARM处理器&#xff0c;并能够运行Windows 11操作系统&#xff0c;给用户带来了前所未有的强大性能和多样化的应用体验。 首先&#xff0c;让我们来聊聊这款平板电脑的核…

数字世界的探索者:计算机相关专业电影精选推荐

目录 推荐计算机专业必看的几部电影 《黑客帝国》 《社交网络》 《乔布斯传》 《心灵捕手》 《源代码》 《盗梦空间》 《头号玩家》 《我是谁&#xff1a;没有绝对安全的系统》 《战争游戏》(WarGames) 《模仿游戏》(The Imitation Game) 《硅谷》(Silicon Valley) …

力荐程序猿/媛必看电影/电视剧

前言 电影不仅是一种极富趣味的娱乐形式&#xff0c;而且在带来欢乐的同时&#xff0c;还能拓宽人们的视野&#xff0c;让人增长知识。许多电影也展现了编剧和导演极其出众、强大的创造力&#xff1b;还有一些电影&#xff0c;在我们不了解相关专业知识的情况下&#xff0c;可…