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

news/2024/12/23 15:10:14/

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/news/1557492.html

相关文章

AI的进阶之路:从机器学习到深度学习的演变(三)

&#xff08;承接上集&#xff1a;AI的进阶之路&#xff1a;从机器学习到深度学习的演变&#xff08;二&#xff09;&#xff09; 四、深度学习&#xff08;DL&#xff09;&#xff1a;机器学习的革命性突破 深度学习&#xff08;DL&#xff09;作为机器学习的一个重要分支&am…

【全栈开发】----用pymysql库连接MySQL,批量存入

本文基于前面的MySQL基础语句使用&#xff0c;还不会的宝子可以先回去看看&#xff1a; 全栈开发----Mysql基本配置与使用-CSDN博客 仅仅用控制台命令对数据库进行操作&#xff0c;虽然大部分操作都很简单&#xff0c;但对于大量数据的存入&#xff0c;存储数据将会变得很繁琐&…

uniapp 微信小程序 功能入口

单行单独展示 效果图 html <view class"shopchoose flex jsb ac" click"routerTo(要跳转的页面)"><view class"flex ac"><image src"/static/dyd.png" mode"aspectFit" class"shopchooseimg"&g…

springboot集成activiti工作流

前言 activiti工作流引擎项目&#xff0c;企业erp、oa、hr、crm等企事业办公系统轻松落地&#xff0c;一套完整并且实际运用在多套项目中的案例&#xff0c;满足日常业务流程审批需求。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器&#xff0c;流行的前后端…

Nuc9 Truenas 和 Macmini4组雷电网桥 上传速度异常 1Mbp/s 解决

link: 原创文章&#xff0c;转载之前请标注来源博客 helsonlin 前言 咸鱼整了一台 Nuc9 组了全闪的 Nas&#xff0c;想着和 Macmini 组雷电网桥&#xff0c;但是到手弄好之后发现 iperf3 和 openspeedtest 测试上传的速度都是 1Mbps 每秒。 Google 一下发现唯一的线索就是ht…

react概念篇

jsx 定义 jsx 又称JavaScript xml(xml一般指的是可扩展编辑语言) jsx是react提供的语法糖&#xff0c;能让我们在JS中写HTML 语法 只有一个根元素 使用js变量时&#xff0c;用插值表单式 {} dom元素的class改为了className&#xff08; className{‘div ’active? ‘action’…

linux---使用定时任务同步时间

首先&#xff0c;确保你的系统上安装了ntpdate工具&#xff0c;它用于从NTP服务器获取并设置系统时间。如果你的系统上没有安装&#xff0c;你可以通过包管理器进行安装 安装ntpdate yum install -y ntpdate设置定时任务 crontab -e在文件中添加下面内容 #每5分钟同步一次时间 …

Python 爬取网页文字并保存为 txt 文件教程

引言 在网络数据获取的过程中&#xff0c;我们常常需要从网页中提取有用的文字信息。Python 提供了强大的库来帮助我们实现这一目标。本教程将以https://theory.gmw.cn/2023 - 08/31/content_36801268.htm为例&#xff0c;介绍如何使用requests库和BeautifulSoup库爬取网页文字…