MySQL 的 Redo Log(重做日志)是 InnoDB 存储引擎的核心组件之一,是保证数据库持久性(Durability) 和崩溃恢复(Crash Recovery) 的关键机制。


1. 什么是 Redo Log?它的核心作用是什么?

核心作用: 保证事务的持久性(Durability)

这意味着,只要一个事务成功提交(COMMIT),那么它对数据库所做的修改就绝对不会丢失,即使随后发生数据库宕机、断电等故障,在重启后也能通过 Redo Log 恢复这些已提交的修改。

简单比喻:
想象一下一家生意火爆的餐馆。

  • 磁盘上的数据文件(.ibd):就像后厨的正式账本,记录着所有订单的最终状态。但每做一笔都直接记上去,效率太低。

  • Buffer Pool(内存缓冲池):就像服务员手里的点餐小票,记录了最新的订单。读写速度快,但一撕就丢(掉电丢失)。

  • Redo Log:就像服务员飞速记在黑板上的订单。客人下单(事务提交)后,服务员会立刻先把订单写到黑板上,然后再慢慢交给后厨处理。即使后厨还没来得及把菜做完(数据没刷盘)或者服务员手里的小票丢了(内存丢失),只要黑板上的字还在,就能知道客人点了什么,确保订单不会丢失。

这个“先写黑板,再慢慢处理”的过程,就是著名的 Write-Ahead Logging (WAL) 技术,而 Redo Log 就是实现 WAL 的载体。


2. 为什么需要 Redo Log?—— 解决性能问题

如果没有 Redo Log,为了保证持久性,InnoDB 必须在每次事务提交时,都将该事务修改的所有数据页随机地、同步地刷新到磁盘上。

  • 随机 I/O:数据页在磁盘上分布是零散的,写入是随机写,速度很慢。

  • 同步 I/O:提交操作必须等待所有慢速的磁盘 I/O 完成,用户线程会被阻塞。

这会产生巨大的性能瓶颈,因为磁盘的随机 I/O 速度远低于内存操作和顺序 I/O。

Redo Log 的解决方案:

  1. 顺序 I/O:Redo Log 的记录是追加写入的,是顺序写,速度极快(甚至可以用专门的 SSD 优化)。

  2. 组合写入:多个事务的修改可以合并在一起,一次性写入日志文件,大大减少了磁盘 I/O 次数。

  3. 异步刷盘:事务提交时,只需要保证 Redo Log 成功写入(顺序写,很快),就可以返回成功。内存中的数据页(脏页)则由后台线程异步地、批量地刷新到磁盘(随机写),这个操作不会阻塞用户请求。

所以,Redo Log 通过将随机写转换为顺序写,极大地提升了数据库的写入性能,同时保证了事务的持久性。


3. Redo Log 的组成与工作流程

物理结构

Redo Log 在物理上由两个文件组成,通常命名为 ib_logfile0 和 ib_logfile1。它们被设计成循环写入的固定大小文件。

  • innodb_log_file_size: 每个 Redo Log 文件的大小。

  • innodb_log_files_in_group: Redo Log 文件的数量,默认为 2。

  • 总日志大小 = innodb_log_file_size * innodb_log_files_in_group

逻辑结构

逻辑上,Redo Log 是一个连续的顺序写入空间。为了管理循环写入,它维护了几个关键指针:

  • write pos(写入位置):当前记录写入的位置,随着写入不断后移。

  • checkpoint(检查点):表示已经刷新到磁盘数据文件的位置。它之前的数据已经被持久化,对应的日志空间可以被覆盖。

write pos 和 checkpoint 之间的空间是空闲的可写入部分。当 write pos 追上 checkpoint(即日志文件写满)时,数据库必须停下来,先推进 checkpoint(强制刷脏页),释放出可重用的日志空间,然后才能继续处理新的更新操作。因此,设置过小的 Redo Log 文件会导致频繁的“卡顿”。

工作流程(以 UPDATE 为例)
  1. 数据载入:要修改的数据页如果不在 Buffer Pool 中,则从磁盘加载到 Buffer Pool。

  2. 修改内存:在 Buffer Pool 中修改数据页,使其变成“脏页”。

  3. 写入 Redo Log Buffer:生成一条 Redo Log 记录,描述这个“物理页面”上的修改(如:表空间ID、页号、偏移量、修改后的值等)。这条记录首先被写入到内存中的 Redo Log Buffer

  4. 事务提交:当用户执行 COMMIT 时,根据 innodb_flush_log_at_trx_commit 的设置,InnoDB 会采取不同的行为将 Redo Log Buffer 中的内容刷新到磁盘的 Redo Log 文件。这是保证持久性的关键步骤。

  5. 刷盘通知:事务提交后,即可返回客户端成功。后台的 I/O 线程会在未来某个时间点将 Buffer Pool 中的“脏页”刷新到磁盘的数据文件中。

  6. 推进 Checkpoint:当脏页被成功刷盘后,对应的 Redo Log 记录就失去了作用(已经持久化了)。Checkpoint 位置就可以向前推进,这部分日志空间可以被后续的写入覆盖。


4. 关键配置参数:innodb_flush_log_at_trx_commit

这个参数控制了事务提交时,刷新 Redo Log 到磁盘的策略,是在性能持久性保证之间进行权衡的关键。

  • = 1 (默认值)

    • 行为:每次事务提交时,都会将 Redo Log Buffer 的内容同步写入并刷新(fsync) 到磁盘。

    • 保证:最严格的持久性保证。即使宕机,也绝不会丢失任何已提交的事务。

    • 缺点:因为每次提交都要发生一次磁盘 I/O(虽然是顺序的),性能是最差的。

  • = 2

    • 行为:每次事务提交时,仅将 Redo Log Buffer 的内容写入到操作系统的页面缓存(Page Cache),但不执行 fsync 刷盘操作。

    • 保证:只有在操作系统不宕机(比如MySQL进程崩溃,但服务器没重启)的情况下,才能保证不丢数据。如果服务器断电,而操作系统缓存中的数据还没来得及刷盘,那么这部分数据就会丢失。

    • 性能:比 =1 好,因为写入 Page Cache 非常快。

  • = 0

    • 行为:每秒一次地将 Redo Log Buffer 的内容写入 Page Cache 并调用 fsync 刷到磁盘。事务提交时本身不会触发任何写入。

    • 保证:安全性最差。如果 MySQL 进程崩溃,最多会丢失 1 秒内提交的事务。如果服务器断电,最多可能丢失超过 1 秒的数据(因为还可能有一部分在 Buffer 里没写到 Page Cache)。

    • 性能:最好。

如何选择?

  • 要求绝对数据安全(如金融交易):必须使用 1

  • 可以容忍丢失极少量数据(如点赞、评论):可以设置为 2,性能提升显著。

  • 对性能要求极高,且数据不重要:可考虑 0(一般不推荐)。


5. Redo Log 与 Binlog 的区别

这是一个经典面试题。虽然都是日志,但两者截然不同:

特性Redo LogBinlog (二进制日志)
归属InnoDB 引擎层独有的MySQL Server 层实现的,所有存储引擎都可以使用
类型物理日志
记录的是“在某个数据页上做了什么修改”
逻辑日志
记录的是语句的原始逻辑(如 UPDATE t SET f1=1)或行变更前后的镜像
写入方式循环写
文件固定大小,写满会覆盖
追加写
文件写完后会切换到下一个,不会覆盖旧日志
用途崩溃恢复 (Crash Recovery)
保证事务的持久性
数据归档、主从复制 (Replication)
Point-in-Time Recovery(按时间点恢复)

在 MySQL 5.6 引入 两阶段提交(2PC) 之前,需要保证 Redo Log 和 Binlog 的一致性是一个复杂的问题。两阶段提交机制确保了即使发生崩溃,二者也能保持逻辑上的一致。


总结

  • 是什么:Redo Log 是 InnoDB 的物理日志,采用循环写入方式。

  • 为什么:为了将随机写转换为顺序写提升写入性能,同时保证事务的持久性(WAL 技术的实现)。

  • 怎么做:事务提交时,先强制写入 Redo Log(取决于 innodb_flush_log_at_trx_commit 设置),再异步刷脏页。

  • 关键点:通过 write pos 和 checkpoint 管理循环写入,通过配置参数在性能和数据安全间做权衡。

  • 区别:与 Server 层的逻辑日志 Binlog 在归属、类型、用途上完全不同。

理解 Redo Log 是理解 InnoDB 如何协调高性能与数据安全性的基石。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux相机(2)

本人从0开始学习linux,使用的是韦东山的教程,在跟着课程学习的情况下的所遇到的问题的总结,理论虽枯燥但是是基础。本人将前几章的内容大致学完之后,考虑到后续驱动方面得更多的开始实操,后续的内容将以韦东山教程Linux项目的内容…

云计算学习100天-第34天 -zabbix监控2

SourceURL:file:///home/student/Documents/zabbix.doczabbix服务器配置1. 拷贝zabbix软件包到pubserver#在此之前先从真机拷贝安装包[rootserver1 ~]# scp /linux-soft/s2/zzg/zabbix_soft/*.rpm 192.168.88.5:/root/#然后拷贝到pubserver[rootzabbixserver ~]# scp /linux-so…

猫头虎AI分享:无需OCR,基于ColQwen2、Qwen2.5和Weaviate对PDF进行多模态RAG的解决方案

无需OCR,基于ColQwen2、Qwen2.5和Weaviate对PDF进行多模态RAG的解决方案 关键词:多模态RAG、ColQwen2、Qwen2.5-VL、Weaviate 向量数据库、PDF 检索问答、无需 OCR、ColBERT 多向量、跨模态检索、MaxSim 相似度、知识库构建、AI 文档处理、视觉语言模型、…

HTML第三课:特殊元素

HTML第三课&#xff1a;特殊元素特殊元素代码展示特殊元素 不在行级元素和块级元素概念里面的元素无法控制没有宽高的元素 代码展示 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewpo…

蓝桥杯算法之基础知识(5)

目录 Ⅰ.in方法的使用 Ⅱ.字典的使用 Ⅲ.1MB 、KB、 B、 b(即bit)的转换&#xff08;必学&#xff09; Ⅳ.闰年or平年 Ⅴ.count和counter方法 1. count() 方法的使用场景 2. Counter 类的介绍 3. count() 与 Counter 的区别 4. Counter 的高级应用 5.Counter的另一种使用 Ⅵ.ma…

lesson52:CSS进阶指南:雪碧图与边框技术的创新应用

目录 一、CSS雪碧图&#xff1a;从性能优化到交互革命 1.1 技术原理与现代价值 1.2 2025年实现工具与自动化流程 1.2.1 构建工具集成方案 1.2.2 在线生成工具推荐 1.3 高级应用案例与代码实现 1.3.1 多状态按钮系统 1.3.2 响应式雪碧图实现 1.4 最佳实践与性能优化 二…

案例——从零开始搭建 ASP.NET Core 健康检查实例

1. 项目创建与基础设置 创建新项目 首先&#xff0c;创建一个新的 ASP.NET Core Web API 项目&#xff1a; dotnet new webapi -n HealthCheckDemo cd HealthCheckDemo添加必要的 NuGet 包 添加健康检查相关的 NuGet 包&#xff1a; dotnet add package Microsoft.AspNetCore.D…

【Java生产级避坑指南】8. Tomcat线程池下的内存地雷:ThreadLocal泄漏检测与实战解决

摘要:某金融交易系统(Spring Boot 2.7 + Tomcat 9)在线上运行时出现严重内存泄漏:堆内存(4GB)72小时内耗尽并触发OOM,日均200万请求场景下,Full GC频率从正常1次/天飙升至6次/小时。排查发现,根源是ThreadLocal未清理——Tomcat线程池复用线程时,UserInfo等大对象被T…

云端职达:你的AI求职专属猎头,颠覆传统招聘模式

在求职的“金三银四”或“金九银十”&#xff0c;每一分每一秒都弥足珍贵。面对浩如烟海的招聘信息&#xff0c;你是否还在花费大量时间一条条筛选、重复投递简历&#xff0c;最终却常常石沉大海&#xff1f;传统求职方式的低效和“已读不回”的窘境&#xff0c;让许多求职者感…

Parasoft C/C++test如何实现开发环境内嵌的安全检测

Parasoft 作为嵌入式质量与安全领域的全球领先供应商&#xff0c;其 C/Ctest 平台依托 IDE 级原生集成、实时合规检测引擎与缺陷闭环治理框架&#xff0c;将传统静态应用安全测试由项目末期集中执行前移至编码阶段&#xff0c;显著降低缺陷修复成本并缩短认证周期&#xff0c;为…

leetcode-每日一题-人员站位的方案数-C语言

3025. 人员站位的方案数 I 输入&#xff1a; 2 < n < 50 points[i].length 2 0 < points[i][0], points[i][1] < 50 points[i] 点对两两不同。 // 按x降序&#xff0c;按y升序 int cmp(const void *a, const void *b) {int *p *(int **)a;int *q *(int **)b;if(…

ClickHouse中的ON CLUSTER关键字

目录 ClickHouse中的ON CLUSTER关键字 前置基础 ClickHouse 中的 MergeTree 与 ReplicatedMergeTree ON CLUSTER 查询在集群上的正确用法(为什么 查询/写入数据 不用 ON CLUSTER) 与不使用 ON CLUSTER 的区别 注意事项与坑 常用配套命令 ClickHouse中的ON CLUSTER关键字 前置…

Python绘图动态可视化:实时音频流

在数据可视化中&#xff0c;动画是一种非常有效的方式&#xff0c;可以帮助我们更好地理解数据的变化和动态过程。Python 的 matplotlib.animation 模块提供了强大的功能来创建动画。本文将介绍如何使用 matplotlib.animation 创建简单的动画&#xff0c;并展示一个更复杂的实时…

【Vue2 ✨】Vue2 入门之旅(七):事件处理

在前几篇文章中&#xff0c;我们学习了指令与过滤器。本篇将介绍 事件处理&#xff0c;重点包括 v-on、事件修饰符以及键盘事件。 目录 事件绑定 v-on事件修饰符键盘事件小结 事件绑定 v-on Vue 使用 v-on&#xff08;缩写 &#xff09;来监听事件。 <div id"app&qu…

高效数据传输的秘密武器:Protobuf

当涉及到网络通信和数据存储时&#xff0c;数据序列化一直都是一个重要的话题&#xff1b;特别是现在很多公司都在推行微服务&#xff0c;数据序列化更是重中之重&#xff0c;通常会选择使用 JSON 作为数据交换格式&#xff0c;且 JSON 已经成为业界的主流。但是 Google 这么大…

腾讯混元翻译大模型Hunyuan-MT-7B:重塑跨语言沟通的技术革命

腾讯混元翻译大模型Hunyuan-MT-7B&#xff1a;重塑跨语言沟通的技术革命 腾讯混元Hunyuan-MT-7B大模型的发布标志着机器翻译领域进入全新时代&#xff0c;本文将深入解析这一突破性技术如何实现30种语言翻译冠军的卓越表现 一、Hunyuan-MT-7B核心架构解析 1.1 基于Transformer的…

End-To-End 之于推荐-kuaishou OneRec2 笔记

End_To_End 之于推荐onerec里&#xff0c;快手利用大模型做了推荐架构的革命&#xff0c;几个月后&#xff0c;v2之于v1是一些技术细节进行了进一步迭代&#xff0c;主要是以下两个方面&#xff1a; 1. 架构层面的突破&#xff1a;Lazy Decoder-Only 背景问题&#xff1a;V1 的…

【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)

3670. 没有公共位的整数最大乘积 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; SOSDP 本题我们显然不能枚举每一个数对&#xff0c;n 的复杂度显然超时&#xff0c;所以考虑优化 我们考虑一个二进制数 mask&#xff0c;因为我们必须要选没有任…

Sping Web MVC入门

1.什么是Sping Web MVC1.1MVC定义2.什么是Spring MVC

LLM面试50问:NLP/RAG/部署/对齐/安全/多模态全覆盖

太好了!下面按你点名的 6 大主题(NLP、检索/RAG、部署、对齐、 安全、多模态)给出深度版答案 + 关键公式/推导 + 最小可跑示例代码 + 常见坑。都尽量精炼到“拿来即用/面试可白板推导”的粒度。 NLP(架构、位置编码、指令跟随) 1) RoPE 长上下文与缩放 要点:RoPE 将位置…