您的当前位置:首页 >系统运维 >MySQL事务未提交Redolog能持久化到磁盘吗? 正文
时间:2025-11-05 09:31:58 来源:网络整理编辑:系统运维
今天的文章内容围绕一位网友的评论去展开,在看完小许文章【结合MySQL更新流程看 undolog、redolog、binlog】,他提出了这么一个问题,如下:图片换个方式提取出他想问的:可以理解为如果
今天的提交文章内容围绕一位网友的评论去展开,在看完小许文章【结合MySQL更新流程看 undolog、持久磁盘redolog、提交binlog】,持久磁盘他提出了这么一个问题,提交如下:
图片
换个方式提取出他想问的持久磁盘:可以理解为如果在redolog持久化过程中,意外情况导致事务未提交,提交那是持久磁盘不是redolog就写入不了磁盘了?
本期内容就从这个问题进行展开要讲的内容!
我们知道持久化的提交目的是可以在数据丢失后进行恢复,保证数据不丢失,持久磁盘对于MySQL来说只要 binlog 和 redolog 都能正确持久化到磁盘上,提交就可以保证数据不丢失了。持久磁盘
👉 那意外情况导致事务还没提交的提交时候,redolog 能不能被持久化到磁盘呢?持久磁盘
先公布答案,确实有可能会!提交
为什么会有这种可能呢,难道是被动刷盘了?先不着急想象,我们接着往下看,这个问题今天必须拿下!
图片
没看过开头提到的文章建议返回去看下,这里再进行下核心知识点的服务器租用回忆。
redo log 其实记录的是此次事务「完成后」的数据状态,记录的是更新之后的值。
我们来回顾看下redolog的写入流程:
图片
1. 修改操作时先将原始数据从磁盘中读入内存中来,修改数据,如图中的脏页
2. 此时产生日志写入redo logbuffer,记录的是数据被修改后的值
3. 当事务commit时,将redo logbuffer中的内容采用追加方式刷新到redo logfile
4. 调用fsync将修改的数据刷新到磁盘中
也就是说redolog可能存在于三种位置状态:
图片
redolog buffer:
写入redo log buffer就用到了的WAL(Write-Ahead Logging)技术,日志先写入redo log buffer缓冲区
page cache:
page cache是文件系统缓冲,如果是写到磁盘,但是没有持久化(fsync),物理上是在文件系统的page cache里面
硬盘disk:
从page cache 持久化到磁盘,也就是高防服务器磁盘中的redo log file中,你在data目录中看到的ib_logfile文件就是实际的redo log日志文件,它以文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2..)的形式进行命名。
一般来说事务的提交也应该有以下三个过程:
图片
缓存在 redo log buffer 里的 redo log 是在内存中的,最终是要刷到磁盘中。
👉 那么redo log是如何被控制写入刷入磁盘的呢?
这就涉及到redo log的刷盘策略了
InnoDB通过innodb_flush_log_at_trx_commit 参数可以控制策略,该参数控制 commit 提交事务时,如何将 redo log buffer中的日志刷新到 redo log file 中,它支持设定0,1, 2也就是说支持三种策略设置。免费信息发布网
这个策略我们可以用参数设置:
复制show variables like innodb_flush_log_at_trx_commit //默认情况下 innodb_flush_log_at_trx_commit值是11.2.Innodb存储引擎有一个后台线程,每隔1秒,就会把 redo log buffer 中的内容写到文件系统缓存(Page Cache),然后调用fsync进行刷入到磁盘的操作。
延迟写设置为0(延迟写) :每次事务提交时不主动进行刷盘操作,redo log依然留在redo log buffer中,然后后台进程每秒写入page cache中,然后持久化到磁盘中。
图片
设置为1 (实时写,实时刷):每次事务提交时都会直接将缓存在redo log buffer中的redo log直接持久化到磁盘中( 默认值 )。
图片
设置为2(实时写,延时刷) :表示每次事务提交时都只把 redo log buffer 内容写入 page cache,不进行同步,由os自己决定什么时候同步到磁盘文件。
图片
看了redo log可能存在的状态和位置,以及写盘策略,那跟事务是否提交redo log能否写入磁盘有啥关系呢。
那我们看下面几种情况是不是在事务没提交的时候也可能会写入到磁盘呢!
后台线程每隔1s刷新上面我们说到InnoDB 有一个后台线程,每隔 1 秒轮询一次,具体的操作是这样的:调用 write 将 redolog buffer 中的日志写到文件系统的 page cache,然后调用 fsync 持久化到磁盘。
那么写入到redolog buffer中的redo log在事务没提交的时候,可能就会后台线程在持久化的时候被一起持久化到磁盘中。
其他事务提交成功我们在设置写盘策略的时候 innodb_flush_log_at_trx_commit 设置为1,在每次事务提交的时候都会直接将缓存在redo log buffer中的redo log直接持久化到磁盘中。
举个栗子,事务 A 执行到一半,此时 redolog 到 redolog buffer 中,这时候有另外一个事务 B 提交,事务 B 要把 redolog buffer 里的日志全部持久化到磁盘,这时候就会带上是不是事务 A 在 redolog buffer 里的日志一起持久化到磁盘。
(⊙o⊙)…
redo log buffer 空间快满了另一种说法是当redo log buffer 占用的空间达到 redolog buffer 大小一半的时候,后台线程会主动写盘。
redo log buffer 占用空间由参数 innodb_log_buffer_size 控制,默认是 8MB
但是这个写盘动作只是 write 到了文件系统的 page cache,仍然是在内存中,并没有调用 fsync 真正落盘。
🔔朋友们下次当面试官问你:事务还没提交的时候,redo log 能不能被持久化到磁盘呢?
你应该知道如何回答了吧,哈哈,拿下!
Redis 技术深度解析与应用场景2025-11-05 08:26
国产数据库要进入下半场了吗?2025-11-05 07:56
2025年二月热门开源网络安全工具盘点2025-11-05 07:54
探索骨传导耳机的功能与优势(全面了解骨传导耳机的工作原理、音质表现和使用场景)2025-11-05 07:48
Redis 实现库存扣减操作的技术探讨2025-11-05 07:44
微软Majorana 1 开启量子计算新纪元,过渡到后量子密码学刻不容缓2025-11-05 07:41
利用多向量和高级搜索数据模型设计城市数据2025-11-05 07:05
优尔得老人手机——为老年人打造的贴心通信工具(功能齐全、简单易用的老人手机选择)2025-11-05 07:04
剖析 Redis List 消息队列的三种消费线程模型2025-11-05 07:01
任天堂2DS(探索这款便携式掌机的魅力与创新)2025-11-05 09:20
复杂场景的数据库运维诊断,AI可堪一战?2025-11-05 09:18
使用uuid作为数据库主键,被技术总监怼了一顿!2025-11-05 09:13
Zabbix 5.2由浅入深系列之监控华为交换机(盒式)2025-11-05 09:13
康达智控(探索智能控制未来,康达智控扬帆起航)2025-11-05 09:11
面试官:GROUP BY和DISTINCT有什么区别?2025-11-05 09:00
一文学会效率提升技巧2025-11-05 08:53
2.84亿账户遭信息窃取木马窃取,Have I Been Pwned紧急更新数据库2025-11-05 08:35
SSH 防护终极方案:这个自动封禁脚本让黑客直接自闭!2025-11-05 08:09