Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql事务的前世今生-什么是redo日志

mysql事务的前世今生-什么是redo日志

作者头像
热心的大肚皮
发布于 2023-02-28 06:01:00
发布于 2023-02-28 06:01:00
34500
代码可运行
举报
运行总次数:0
代码可运行

大家好,我是热心的大肚皮,皮哥。

redo日志是啥

我们知道,InnoDB是以页为单位来管理存储空间的,增删查改其实都在访问页面(读页面、写页面、创建页面等操作),之前聊Buffer Pool时说过,操作前,都是将磁盘数据加载到缓冲区中,然后在操作,聊事务时,有个持久性(Durability)的特性,也就是事务提交后,系统崩溃,也不能丢失这个事务的修改。

如果简单粗暴的刷新16K的索引页,会造成性能浪费,并且页在Buffer Pool中以随机的方式存在,随机IO的刷新效果也差的多。而且也没必要每次事务提交时,将全部修改的页面刷新到磁盘上,只要把修改的内容记录一下就好,这样事务完成时,哪怕出现故障也可以快速恢复。

那么怎么去记录呢?比如,某个事务将user表中的第6条纪录的第8个字段的值由1修改为2,而假设物理地址在第6个页面中偏移量为88处,只需要记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
将user表空间第6号页面中偏移量为88处的值更新为2.

这样事务提交时,这种记录空间使用极小,而且采用顺序写入磁盘。这就是redo log(redo日志)。

redo日志格式

根据上面我们可以想象到redo日志的格式,如下。

  • type:这条redo 日志的类型。
  • space ID:表空间id。
  • page number:页号。
  • data:这条日志的具体内容。

其实这也是通用的数据格式。为了节约空间,作者在type中也做了区分,分别是:

  • MLOG_1BYTE(type对应的十进制数字为1):页面某个偏移量写入1个字节的redo日志类型。
  • MLOG_2BYTE(type对应的十进制数字为2):页面某个偏移量写入2个字节的redo日志类型。
  • MLOG_4BYTE(type对应的十进制数字为4):页面某个偏移量写入4个字节的redo日志类型。
  • MLOG_8BYTE(type对应的十进制数字为8):页面某个偏移量写入8个字节的redo日志类型。具体如下:
  • MLOG_WRITE_STRING(type对应的十进制数字为30):页面某个偏移量写入1个字节序列的redo日志类型。具体如下:

大家看到这里其实也会很好奇,这些数据格式如此简单,怎么满足其他复杂的场景呢?比如索引的修改、大批量数据删除时的场景呢?对于复杂的一些场景,作者也提出了一些新的redo日志类型。如下:

  • MLOG_REC_INSERT(type对应的十进制数字为9):在插入一条使用非紧凑行格式(REDUNDANT)的记录。
  • MLOG_COMP_REC_INSERT(type对应的十进制数字为38):在插入一条使用紧凑行格式(COMPACT、DYNAMIC、COMPRESSED)的记录。
  • MLOG_COMP_PAGE_CREATE(type对应的十进制数字为58):在创建一条存储紧凑行格式的页面。
  • MLOG_COMP_REC_DELETE(type对应的十进制数字为42):在删除一条使用紧凑行格式的记录。
  • MLOG_COMP_LIST_START_DELETE(type对应的十进制数字为44):从某条给定记录开始删除页面中一系列使用紧凑行格式的记录。
  • MLOG_COMP_LIST_END_DELETE(type对应的十进制数字为43):删除页面中一系列使用紧凑行格式的记录一直到redo 日志中对应的记录为止。

redo日志还有很多类型就不一一列举了,其实分这么种类型最主要的目的是节约资源提高性能,能不存就不存,这里给大家展示MLOG_COMP_REC_INSERT的数据结构

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿日常笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
redo log(1)—mysql进阶(五十九)
上篇文章说了我们可以用begin 和statr transaction,提交可以commit,rollback回滚,可以指定回滚到保存点,也可以设置全局变量set autocommit off。也会隐式提交,比如开启事务后,如果操作或者新增了表,比如create table等语句,会隐式提交前面的sql。
用户9919783
2022/07/29
3560
MySQL——redo日志
在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的顺序写入磁盘的,也就是使用顺序I/O。
爪哇缪斯
2023/05/10
1K0
MySQL——redo日志
redo log-Transaction(2)—mysql进阶(六十)
前面我们说了为了吧buffer pool的数据持久化到磁盘上,比如修改了一条数据,不可能每次吧整个页的数据都刷新过去,这样耗费性能,innoDB就是把修改的数据记录在redo日志里,redo日志格式主要是spaceId,type,page_number,offset,Data等。Offset记录上一条数据的地址,为了修改上一条记录头部新的next record,data记录的就是真实数据。Redo日志主要关注的就是一条语句修改了多少b+树,针对其中某颗树,可能增加了页,也可能更新了叶子节点或者内节点。他会记录修改日志或者删除日志,而删除日志格式又会分为开始和结束,MLOG_COMP_LIST_START_DELETE和MLOG_COMP_LIST_END_DELETE。
用户9919783
2022/07/29
2860
面试题77:请介绍一下redo日志类型中的复杂日志是什么?
当我们执行一条INSERT语句涉及的更新内容的时候,其实并不是只是对用户数据进行了插入操作,底层其实涉及了很多,比如页数据的更新,分裂,数据迁移,甚至是,如果采用默认row_id来维护记录的唯一标识的话,还会涉及到面试题76中介绍的MAX_ROW_ID的变动。下面我们通过一幅图来直观的看一下一条INSERT语句所涉及到的数据变动有哪些:
爪哇缪斯
2023/05/10
1360
面试题77:请介绍一下redo日志类型中的复杂日志是什么?
MySQL原理简介—7.redo日志的底层原理
redo log可以保证事务提交后:如果事务中由增删改SQL更新的缓存页还没刷新到磁盘时MySQL宕机,那么MySQL重启后,就可以把redo log重做一遍,恢复事务在当时更新的缓存页,然后再把缓存页刷新到磁盘。
东阳马生架构
2025/02/08
1600
面试题76:请介绍一下redo日志类型中的物理日志是什么?
在对页面的修改是极其简单的情况下(下面会有例子),redo日志中只需要记录一下在某个页面的某个偏移量处修改了几个字节的值、具体修改后的内容是啥就好了。
爪哇缪斯
2023/05/10
1670
面试题76:请介绍一下redo日志类型中的物理日志是什么?
Mysql专栏 - redo log日志细节
本节讲述的是redolog日志,介绍redo log写磁盘的过程以及redo log的随机写和顺序写,最后我们讲介绍关于mysql最常见的事务问题,并且介绍mysql的事务隔离级别以及隔离级别的特性。
阿东
2021/10/08
8990
深入理解MySQL innodb日志管理
1、innodb存储引擎是支持事务ACID特性的,这个理论基本就是一个关系型数据库相关的数据恢复原形设计,包括日志、回滚、redo、并发控制、buffer pool等管理方面,内容非常全面;
星哥玩云
2022/08/17
6590
不重用的undo日志 (2)—mysql进阶(六十五)
前面我们说了undo日志在insert,update,delete存储的日志格式,delete存储的type是trx_undo_del_mark_rec里面有个参数old roll_pointer会指向insert的地址值,恢复需要的数据。Select是没有undo日志的,因为select不需要回滚事务。
用户9919783
2022/07/29
3610
图文结合带你搞懂MySQL日志之Redo Log(重做日志)
请读者注意:本文基于 GreatSQL 8.0.25 & MySQL 5.7.7-RC版本,在 MySQL8.0.30 Redo 发生变化,详情见: MySQL 8.0.30动态redo log初探
老叶茶馆
2023/02/18
8700
图文结合带你搞懂MySQL日志之Redo Log(重做日志)
🍑 MySQL事务日志 redo log 详解:
Innodb存储引擎是以页为单位来管理存储空间的。在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(Check Point机制),通过缓冲池来优化CPU和磁盘之间的鸿沟,这样就可以保证整体的性能不会下降太快。
爱吃糖的范同学
2023/02/15
2K0
详解MySQL的Redo日志与Undo日志
本文分两部分, 第一部分概念介绍,重在理解。 第二部分通过MySQL Innodb中的具体实现,加深相关知识的印象。 本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写。但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节;二是内容与范围的取舍,既想有点技术性避免空谈,又不想陷入枯燥冗长的小细节描述。几番折腾,目前的想法把坑填上,能写完就不错了,你读起来有不顺或错误的地方请见谅,欢迎反馈。
Bug开发工程师
2020/02/12
2.4K0
详解MySQL的Redo日志与Undo日志
redo日志文件格式(3)—mysql进阶(六十一)
前面我们说了修改一条数据总不能吧16kb的页全部持久化到磁盘上,于是有了redo日志,记录哪些修改的数据,redo日志也有自己的缓存区,并不是直接把数据记录到磁盘上,缓存区是innoDB_redo_buffer_size,默认是16mb,为了保证原子性,他会分为不同的组,当乐观插入的时候,只有一条数据需要插入,则type的第一个字节是1,代表只有一条插入,当悲观插入多条插入的时候,会有一个MLOG_MULTI_REC_END的日志,表示这组记录完毕,若系统宕机重启,解析redo日志时候,没有解析到这个,则前面解析的全部放弃。
用户9919783
2022/07/29
5010
详细分析 MySQL 事务日志(redo log 和 undo log)
InnoDB 事务日志包括redo log和undo log,其中redo log是重做日志,提供前滚操作;undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:
CG国斌
2020/05/26
1.9K0
MySQL底层概述—2.InnoDB磁盘结构
Tablespaces、InnoDB Data Dictionary、Double Write Buffer、redo log和undo log。
东阳马生架构
2025/02/11
1670
说到做到的redo日志
首先说下Mini-Transaction,对底层页面进行一次原子访问的过程叫Mini-Transaction(MTR)。一个事务包含多条语句,一条语句包含多个MTR,每个MTR包含多条redo日志。如下所示:
热心的大肚皮
2023/02/28
3060
说到做到的redo日志
【MySQL (六) | 详细分析MySQL事务日志redo log】
为了最大程度避免数据写入时 IO 瓶颈带来的性能问题,MySQL 采用了这样一种缓存机制:
周三不加班
2019/09/03
3.4K0
【MySQL (六) | 详细分析MySQL事务日志redo log】
MySQL 核心模块揭秘 | 47 期 | 插入记录的 Undo 日志
插入一条记录到表中,首先会插入记录到主键索引,然后遍历二级索引,把记录插入到各个二级索引中。
爱可生开源社区
2024/12/27
1090
MySQL 核心模块揭秘 | 47 期 | 插入记录的 Undo 日志
MySQL 核心模块揭秘 | 52 期 | 删除记录的 Undo 日志
Delete 语句删除表中一条记录,先标记删除主键索引记录,再标记删除二级索引记录。事务提交之后,后台 purge 线程才会把标记删除的记录物理删除,从而最终完成从表中删除一条记录的流程。
爱可生开源社区
2025/02/12
1370
MySQL 核心模块揭秘 | 52 期 | 删除记录的 Undo 日志
【图文详解】MySQL系列之redo log、undo log和binlog详解
这篇文章主要介绍了MySQL系列之redo log、undo log和binlog详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下。
一个会写诗的程序员
2021/03/15
18K1
相关推荐
redo log(1)—mysql进阶(五十九)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档