MySQL InnoDB 存储引擎 Redo Log(重做日志)详解

ops/2024/12/25 1:15:43/

1 Redo Log 的作用与重要性

        Redo Log 是 InnoDB 存储引擎中用于实现事务持久性和崩溃恢复的关键组件。它的主要功能是记录对数据库页(page)所做的物理修改,确保即使在系统崩溃的情况下,已经提交的事务也不会丢失,并且可以被正确地恢复。这使得 InnoDB 具备了 **crash-safe** 的能力,即在发生意外重启时,之前提交的数据不会丢失。

2 Redo Log 的工作机制


2.1 写入过程


   - 当一个事务对数据进行插入、更新或删除操作时,这些更改首先会被记录到内存中的缓冲池(Buffer Pool),同时生成相应的 redo log 记录。
   - 这些 redo log 记录会先存放在内存中的 redo log buffer 中。InnoDB 使用了一个循环缓冲区来存储这些日志条目。
   - 根据配置参数 `innodb_flush_log_at_trx_commit` 的值,决定何时将 redo log buffer 中的内容刷新到磁盘上的 redo log 文件:
     - 设置为0:表示每次事务提交时都只是把 redo log 留在 redo log buffer 中,不立即写入磁盘。这种方式虽然性能较好,但在数据库宕机时可能会丢失数据。
     - 设置为1(默认值):表示每次事务提交时都将 redo log 直接持久化到磁盘,保证了数据的安全性,但效率稍微低一些。
     - 设置为2:表示每次事务提交时都只是把 redo log 写到操作系统的缓存(page cache)里,操作系统再根据自己的调度策略将这些日志写入磁盘。这种方式比设置为1更高效,但如果操作系统也宕机,则可能丢失未同步的日志。

2.2 刷盘机制


   - InnoDB 有一个后台线程每隔一秒就会尝试将 redo log buffer 中的日志调用操作系统函数 `write` 写入文件系统的 page cache,并通过 `fsync` 持久化到磁盘。
   - 此外,当 redo log buffer 占满或者达到一定阈值时,也会触发一次强制刷盘操作,以避免日志溢出导致新的写入无法进行。

2.3 循环使用


   - Redo log 文件是以循环方式使用的,这意味着它们会在写满后重新从头开始覆盖旧的日志条目。每个 redo log 文件都有两个重要的位置指针:
     - write pos:当前记录的位置,随着新日志的产生而不断向前推进,一旦到达最后一个文件末尾就回到第一个文件开头继续写入。
     - checkpoint:当前要擦除的位置,同样也是往后推移并且循环的。它标志着上一次检查点之后的所有更改都已经安全地保存到了数据文件中。因此,在正常情况下,write pos 和 checkpoint 之间的部分就是空闲可写的区域;如果 write pos 追上了 checkpoint,则说明 redo log 已经写满,需要暂停新的写入直到 checkpoint 推进。

2.4 Checkpoints(检查点)


   - Checkpoint 是 InnoDB 用来标识哪些页面已经被成功写回磁盘的一个标记。每当有新的数据页被修改并写入磁盘时,对应的 checkpoint 就会向前移动。
   - 在系统崩溃恢复期间,InnoDB 可以利用 checkpoint 来确定哪些日志条目是必须应用的,从而快速恢复到最近的一致状态。

3 Redo Log 的配置参数


- `innodb_log_buffer_size`:设置 redo log buffer 的大小,默认为16MB。较大的缓冲区可以减少磁盘I/O次数,但同时也增加了内存占用和潜在的数据丢失风险(仅限于非持久化模式下)。
- `innodb_log_group_home_dir`:指定 redo log 文件存放的位置,默认为 "./",即 InnoDB 数据目录所在路径。
- `innodb_log_files_in_group`:定义了属于同一组的 redo log 文件数量,默认为2个,最大支持100个。
- `innodb_log_file_size`:单个 redo log 文件的最大尺寸,默认为48MB。需要注意的是,整个 redo log 系列文件的总容量不能超过512GB(即 `innodb_log_files_in_group * innodb_log_file_size <= 512GB`)。
- `innodb_flush_log_at_trx_commit`:控制 redo log 刷新到磁盘的行为,如前所述,取值范围为0到2,默认为1。

4 总结


        Redo log 是 InnoDB 实现高性能和高可靠性的重要组成部分。通过合理的配置和管理,它可以有效地提高数据库的并发处理能力和灾难恢复能力。理解 redo log 的工作原理对于优化数据库性能以及故障排查都是非常有益的。希望本文能帮助读者更好地掌握这一关键技术特性。


http://www.ppmy.cn/ops/144716.html

相关文章

git命令恢复/还原某个文件、删除远程仓库中的文件

有时刚创建的远程仓库&#xff0c;可能无意中把一些没用的文件上传到仓库&#xff0c;本文介绍一下怎么删除这些文件。 一、git命令恢复某个文件 第一步&#xff1a;拉取最新代码 git pull 第二步&#xff1a; 查看git 修改的文件状态 git status 第三步&#xff1a;查看…

信管通低代码信息管理系统应用平台

目前&#xff0c;国家统一要求事业单位的电脑都要进行国产化替代&#xff0c;替代后使用的操作系统都是基于linux的&#xff0c;所有以前在WINDOWS下运行的系统都不能使用了&#xff0c;再者&#xff0c;各单位的软件都很零散&#xff0c;没有统一起来。需要把日常办公相关的软…

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本

14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…

uni-app开发订单详情页面

目录 一:功能描述 二:功能实现 一:功能描述 订单详情页面包含三部分信息,分别是收货地址信息,订单商品信息和订单信息。 二:功能实现 1:收货地址信息 <view v-if="(detail.order_model == 0 || detail.order_model == 2) && (detail.address_data …

uniapp .gitignore

打开HBuilderX&#xff0c;在项目根目录下新建文件 .gitignore复制下面内容 #忽略unpackge目录下除了res目录的所有目录 unpackage/* !unpackage/res/#忽略.hbuilderx目录 .hbuilderx# 忽略node_modules目录下的所有文件 node_modules/# 忽略锁文件 package-lock.json yarn.l…

解决 Kubernetes 集群中 Calico 网络插件报错问题

文章目录 解决 Kubernetes 集群中 Calico 网络插件报错问题问题分析pod状态报错解读可能原因 解决方案重启 Calico 相关组件验证问题是否解决 进一步检查和优化检查 Calico 配置验证 RBAC 权限监控 Calico 状态定期更新和维护 总结 解决 Kubernetes 集群中 Calico 网络插件报错…

Spring Boot 动态定时任务管理系统(轻量级实现)

Spring Boot项目中&#xff0c;实现动态增删和启停定时任务的功能对于许多应用场景来说至关重要。虽然Quartz框架是一个广泛使用的解决方案&#xff0c;但其复杂性和重量级特性可能使得项目变得臃肿和难以维护。为了解决这个问题&#xff0c;本项目旨在实现一个轻量级的定时任务…

【人工智能】探索当下热门视频生成模型

引言 在当今数字化浪潮下&#xff0c;视频生成模型宛如一颗璀璨的新星&#xff0c;正以惊人的速度改变着内容创作的格局。从影视制作到广告营销&#xff0c;从个人创意表达至教育培训领域&#xff0c;这些智能工具为我们开启了一扇通往无限可能的新大门。接下来&#xff0c;就让…