InnoDB如何保证持久性?MySQL redo日志核心原理说明

来源:网站建设作者:小师妹头衔:草根站长
导读:本期聚焦于小伙伴创作的《InnoDB如何保证持久性?MySQL redo日志核心原理说明》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《InnoDB如何保证持久性?MySQL redo日志核心原理说明》有用,将其分享出去将是对创作者最好的鼓励。

InnoDB存储引擎通过redo日志机制来保证事务的持久性,当MySQL服务发生异常崩溃时,已经提交的事务修改不会丢失,这就是持久性的核心体现。redo日志记录了数据页的物理修改操作,是InnoDB实现崩溃恢复的关键组件。

InnoDB如何保证持久性?MySQL redo日志核心原理说明

什么是redo日志

redo日志是InnoDB存储引擎层产生的日志,属于物理日志,记录了某个数据页上做了什么修改。比如对某个表的某行数据做了更新操作,redo日志会记录对应数据页的修改内容,而不是记录逻辑上的SQL语句。

和binlog不同,binlog是MySQL Server层产生的逻辑日志,记录的是语句的原始逻辑,而redo日志是InnoDB引擎层的物理日志,两者作用场景完全不同。

redo日志的写入机制

redo日志并不是直接写入磁盘的,而是先写入redo log buffer,也就是重做日志缓冲区,这是一块InnoDB在内存中分配的区域,默认大小为16MB。

redo日志的写入流程分为几个阶段:

  • 事务执行过程中,产生的redo日志先写入redo log buffer
  • 事务提交时,根据配置的刷盘策略,将redo log buffer中的内容写入操作系统的page cache,或者直接刷到磁盘的redo log文件中
  • redo log文件是循环写入的,默认有两个文件ib_logfile0和ib_logfile1,写满一个后会切换到另一个,覆盖之前的内容

redo日志刷盘策略

InnoDB通过innodb_flush_log_at_trx_commit参数控制redo日志的刷盘行为,该参数有三个可选值:

参数值刷盘行为持久性保证
0事务提交时,redo log buffer的内容每秒写入page cache,同时刷盘一次MySQL崩溃可能丢失1秒内的已提交事务
1事务提交时,redo log buffer的内容直接写入page cache并刷盘完全保证持久性,是默认配置
2事务提交时,redo log buffer的内容写入page cache,每秒刷盘一次操作系统崩溃可能丢失1秒内的已提交事务

redo日志如何保证持久性

当执行一个更新语句时,InnoDB的处理流程如下:

  1. 执行器调用InnoDB接口,找到对应数据页,如果数据页不在内存中,先从磁盘加载到内存的缓冲池(buffer pool)
  2. 修改缓冲池中的数据页,生成对应的redo日志,写入redo log buffer
  3. 事务提交时,根据innodb_flush_log_at_trx_commit配置,将redo日志刷到磁盘的redo log文件
  4. 返回事务提交成功的响应给客户端
  5. 后续InnoDB的后台线程会将缓冲池中修改过的数据页(脏页)刷到磁盘的数据文件中

这个过程中,只要redo日志已经刷到磁盘,即使后续MySQL崩溃,脏页还没刷到磁盘,重启后InnoDB也可以通过redo日志恢复这些修改,保证已提交事务的修改不会丢失,这就是持久性的实现逻辑。

崩溃恢复流程

当MySQL异常重启后,InnoDB会进入崩溃恢复流程,核心就是读取redo日志进行重做:

  • 首先定位到redo日志中上次刷盘的检查点(checkpoint)位置,检查点之前的redo日志对应的修改已经刷到数据文件,不需要处理
  • 从检查点之后的位置开始,读取redo日志,按照记录的内容重做对应的数据页修改
  • 重做完成后,所有已提交事务的修改都恢复到内存中,后续脏页刷盘后数据就完全恢复

代码示例:查看redo日志相关配置

可以通过以下SQL语句查看InnoDB redo日志的相关配置参数:

-- 查看redo日志刷盘策略
SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';

-- 查看redo log buffer大小
SHOW VARIABLES LIKE 'innodb_log_buffer_size';

-- 查看redo log文件大小
SHOW VARIABLES LIKE 'innodb_log_file_size';

-- 查看redo log文件数量
SHOW VARIABLES LIKE 'innodb_log_files_in_group';

redo日志和binlog的区别

很多开发者会混淆redo日志和binlog,两者的核心区别如下:

  • 层级不同:redo日志是InnoDB引擎层日志,binlog是MySQL Server层日志,所有存储引擎都会产生binlog
  • 日志类型不同:redo日志是物理日志,记录数据页的修改;binlog是逻辑日志,记录SQL语句的原始逻辑
  • 写入时机不同:redo日志在事务执行过程中不断写入,binlog在事务提交时一次性写入
  • 作用不同:redo日志用于崩溃恢复,保证持久性;binlog用于主从复制和数据备份

在实际的MySQL架构中,为了保证主从复制和数据恢复的一致性,通常还需要开启两阶段提交,协调redo日志和binlog的写入顺序,避免出现数据不一致的问题。

InnoDBredo_log持久性MySQL事务修改时间:2026-07-16 23:45:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。