当前位置: 首页 > article >正文

InnoDB REDO LOG 详解:从原理到实现(基于 MySQL 8.0)

在现代关系型数据库系统中事务的持久性Durability是 ACID 特性的关键一环。为了在系统崩溃后仍能恢复数据一致性InnoDB 引擎引入了REDO LOG重做日志机制。本文将深入剖析 REDO LOG 的作用、设计思想、组织结构、写入流程以及清理策略帮助读者全面理解其在 InnoDB 中的核心地位。 目录为什么需要 REDO LOGREDO LOG 的设计目标与 Physiological LoggingREDO LOG 的内容分类REDO LOG 的三层组织结构高效写入机制MySQL 8.0 优化REDO LOG 的安全清理Checkpoint 机制总结延伸阅读1️⃣ 为什么需要 REDO LOGInnoDB 采用Buffer Pool缓存数据页以提升性能对磁盘的修改往往滞后于内存。若此时发生崩溃未刷盘的脏页将丢失破坏数据一致性。 WAL 机制为解决此问题InnoDB 引入WALWrite-Ahead Logging机制┌─────────────────────────────────────────────────┐ │ 在修改 Page 前先将变更记录写入 REDO LOG │ │ 并确保 REDO 先于 Page 落盘 │ └─────────────────────────────────────────────────┘系统重启时通过重放 REDO LOG可将 Page 恢复至崩溃前状态从而保证事务的持久性。2️⃣ REDO LOG 的设计目标与 Physiological Logging理想的 REDO LOG 需满足以下要求设计目标说明数据量小减少 I/O 开销提升吞吐幂等性重放多次结果一致避免重复应用基于 Page便于并行恢复 传统日志对比日志类型优点缺点Logical Logging体积小恢复慢Physical Logging恢复快日志量大 InnoDB 的解决方案Physiological LoggingInnoDB 采用Physiological Logging——以 Page 为单位在 Page 内部使用逻辑方式记录变更。示例MLOG_REC_UPDATE_IN_PLACE(Page ID, Record Offset, (Field 1, Value 1), ..., (Field i, Value i))这种方式兼顾了日志体积与恢复效率但也带来两个挑战⚠️ 挑战一Page 状态必须正确由于 InnoDB Page默认 16KB大于文件系统原子写单位4KB可能出现半写页。解决方案InnoDB 引入Double Write Buffer机制确保总能找到一个完整有效的 Page。⚠️ 挑战二保证重放幂等InnoDB 为每条 REDO 分配全局唯一递增的LSNLog Sequence Number。机制Page 在修改时会记录对应 REDO 的 LSN存于FIL_PAGE_LSN字段恢复时若 Page 的 LSN ≥ REDO 的 LSN则跳过该 REDO实现幂等重放3️⃣ REDO LOG 的内容分类MySQL 8.0 中定义了65 种 REDO 类型可分为三大类 1作用于 Page 的 REDO占绝大多数子类型说明示例Index Page索引页操作MLOG_REC_INSERT,MLOG_REC_UPDATE_IN_PLACE,MLOG_REC_DELETEUndo PageUndo 页操作-R-tree PageR树页操作-示例MLOG_REC_UPDATE_IN_PLACE结构┌─────────────────────────────────────────────────────────┐ │ Header (固定) │ ├─────────────────────────────────────────────────────────┤ │ Type │ Space ID │ Page Number │ ├─────────────────────────────────────────────────────────┤ │ Body (可变) │ ├─────────────────────────────────────────────────────────┤ │ Record Offset │ Update Field Count │ (Field Number, │ │ │ │ Data Length, │ │ │ │ Data) × N │ └─────────────────────────────────────────────────────────┘ 2作用于 Space 的 REDO用于文件级操作类型说明MLOG_FILE_CREATE文件创建MLOG_FILE_DELETE文件删除MLOG_FILE_RENAME文件重命名特点此类 REDO 在操作成功后才记录恢复时主要用于校验文件状态Page Number 固定为 0️ 3Logic 类型 REDO不修改数据仅提供控制信息。类型说明MLOG_MULTI_REC_END标识一个原子操作mtr的结束4️⃣ REDO LOG 的三层组织结构REDO LOG 从逻辑到物理分为三层 1逻辑层Logical REDO由连续的 REDO 记录组成使用全局递增偏移snsequence number标识位置log_sys.sn维护当前最大 sn 2物理层Log Block磁盘以Block为单位读写512B每个 Block 结构┌──────────────────────────────────────────────────────┐ │ Block Header (12 bytes) │ ├──────────────┬──────────────┬──────────────┬─────────┤ │ Flush Flag │ Data Length │ First Record │ Check- │ │ Block Num │ (2B) │ Offset (2B) │ point │ │ (4B) │ │ │ Num (4B)│ ├──────────────────────────────────────────────────────┤ │ Data Area (498 bytes) - Logical REDO │ ├──────────────────────────────────────────────────────┤ │ Block Trailer (4 bytes) - Checksum │ └──────────────────────────────────────────────────────┘跨 Block 存储由于 REDO 长度不定可能跨 Block 存储。 LSN 与 sn 的换算constexprinlinelsn_tlog_translate_sn_to_lsn(lsn_t sn){return(sn/LOG_BLOCK_DATA_SIZE*OS_FILE_LOG_BLOCK_SIZEsn%LOG_BLOCK_DATA_SIZELOG_BLOCK_HDR_SIZE);} 3文件层Redo Files文件命名ib_logfile0,ib_logfile1, …循环使用由innodb_log_files_in_group控制数量文件结构┌─────────────────────────────────────────────────────┐ │ Block 0: Header Block │ │ - Format (4B) │ │ - Start LSN (8B) │ │ - Creator (32B) │ ├─────────────────────────────────────────────────────┤ │ Block 1-3: Checkpoint Blocks (ib_logfile0 only) │ ├─────────────────────────────────────────────────────┤ │ Block 4: Log Data Blocks │ └─────────────────────────────────────────────────────┘LSN 到文件 offset 的映射constautoreal_offsetlog.current_file_real_offset(lsn-log.current_file_lsn);5️⃣ 高效写入机制MySQL 8.0 优化REDO 写入是事务提交的关键路径。MySQL 8.0 引入无锁并发写入架构 写入流程图REDO 生成Log BufferPage Cache磁盘唤醒用户线程 详细步骤1REDO 生成mtrmini-transaction原子操作的所有 REDO 先写入 mtr 的本地m_logmtr_commit()时批量拷贝到 Log Buffer2写入 Log Buffer无锁分配/* Reserve space in sequence of data bytes: */constsn_t start_snlog.sn.fetch_add(len);多个 mtr 并发调用log_buffer_reserve()通过fetch_add原子获取独享空间避免锁竞争3写入 Page Cachelog_writer link_buflink_buf 工作原理┌─────────────────────────────────────────────────────────┐ │ link_buf (循环数组) │ │ [LSN % size] → REDO 长度 │ │ │ │ log_writer 扫描找到连续区域 → 调用 pwrite 写入 OS Cache │ └─────────────────────────────────────────────────────────┘关键变量write_lsn已写入 Page Cache 的位置buf_ready_for_write_lsnLog Buffer 中连续日志的末尾current_lsn已分配的最大 LSN4刷盘log_flusherlog_writer通知log_flusherlog_flusher调用fsync确保持久化5唤醒用户线程优化策略条件变量按 Block 分片减少竞争专用线程负责唤醒log_write_notifier/log_flush_notifier⚙️ 安全级别配置配置值说明安全性性能innodb_flush_log_at_trx_commit1REDO 刷盘后提交⭐⭐⭐⭐⭐⭐⭐⭐2仅写入 OS Cache 即提交⭐⭐⭐⭐⭐⭐⭐⭐6️⃣ REDO LOG 的安全清理Checkpoint 机制REDO 文件空间有限需定期清理已无需保留的日志。InnoDB 通过Checkpoint标记可回收位置。 Checkpoint LSN 的确定需确保 Checkpoint 之前的所有脏页均已刷盘/* LWM lsn for unflushed dirty pages in Buffer Pool */constlsn_t lsnbuf_pool_get_oldest_modification_approx();constlsn_t laglog.recent_closed.capacity();lsn_t lwm_lsnlsn-lag;/* Note lsn up to which all dirty pages have already been added into Buffer Pool */constlsn_t dpa_lsnlog_buffer_dirty_pages_added_up_to_lsn(log);/* Final checkpoint position */lsn_t checkpoint_lsnstd::min(lwm_lsn,dpa_lsn);关键概念lwm_lsnBuffer Pool 中最老脏页的 LSNdpa_lsn已加入 Buffer Pool 的脏页最大 LSNrecent_closedlink_buf处理脏页注册的乱序问题 Checkpoint 存储位置ib_logfile0的 Block 1 和 Block 2交替写入防崩溃内容字段大小说明Checkpoint Number8B用于判断最新记录Checkpoint LSN8BCheckpoint 位置Checkpoint Offset8B文件偏移Log Buffer Size8B暂未使用恢复时从最新 Checkpoint LSN 开始重放后续 REDO。7️⃣ 总结特性说明核心作用保证事务持久性支持崩溃恢复设计思想Physiological Logging物理逻辑混合关键机制LSN 幂等、WAL、Double Write Buffer性能优化无锁并发写入、link_buf、专用唤醒线程空间管理Checkpoint 循环文件REDO LOG 是 InnoDB 实现事务持久性和崩溃恢复的基石。通过Physiological Logging、LSN 幂等机制、三层存储结构以及MySQL 8.0 的无锁并发写入架构InnoDB 在保证数据安全的同时极大提升了写入性能。理解 REDO LOG 的价值✅ 帮助 DBA 优化配置如innodb_log_file_size、innodb_flush_log_at_trx_commit✅ 为开发者设计高性能事务应用提供理论基础✅ 深入理解数据库内核工作原理8️⃣ 延伸阅读官方文档与源码MySQL 8.0 Redo Log FormatMySQL Source Code技术文章New Lock-free, Scalable WAL Design in MySQL 8.0How InnoDB handles REDO logging 本文基于 MySQL 8.0 源码分析

相关文章:

InnoDB REDO LOG 详解:从原理到实现(基于 MySQL 8.0)

在现代关系型数据库系统中,事务的 持久性(Durability)是 ACID 特性的关键一环。为了在系统崩溃后仍能恢复数据一致性,InnoDB 引擎引入了 REDO LOG(重做日志)机制。 本文将深入剖析 REDO LOG 的作用、设计思…...

3.30作业

例图及要求:分析:1、配置各个交换机接口2、全网仅有两个网段,PC1和PC3在一个网段,PC2、PC4、PC5和PC6在一个网段3、路由器配置互联接口4、AR1上配置DHCP服务5、各个主机间相互ping通成果:...

Driver Store Explorer终极指南:三步清理Windows冗余驱动,快速释放数十GB空间

Driver Store Explorer终极指南:三步清理Windows冗余驱动,快速释放数十GB空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间越来越…...

天梯赛L2-006 树的遍历

L2-006 树的遍历 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序…...

如何利用 SEO 工具提取网站的外部链接

如何利用 SEO 工具提取网站的外部链接 在当今竞争激烈的网络环境中,外部链接(即指向你网站的其他网站的链接)已经成为提升网站搜索引擎排名的重要因素。利用 SEO 工具提取网站的外部链接,不仅能帮助你更好地了解你的网站链接情况…...

SEO_中小企业如何低成本做好SEO?实用方案分享

为什么中小企业需要关注SEO 在当今数字化经济时代,中小企业如果想要在竞争激烈的市场中脱颖而出,关注SEO(搜索引擎优化)是必不可少的。SEO不仅能够提升网站的搜索引擎排名,还能有效带来更多的潜在客户。许多中小企业在…...

响应性负载的参考信号发生器不适用于SRF,改进后的SRF生成与Vs同相的参考信号附Simulink仿真

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

2026上海紧固件专业展6月24-26日国家会展中心(上海)举办

2026第十六届上海紧固件专业展(Fastener Expo Shanghai 2026)将于6月24日至26日在国家会展中心(上海)举办。本届展会围绕紧固件全产业链展开,涵盖紧固件成品、冷镦成型设备、模具耗材、检测包装、表面处理以及原材料供…...

层叠与优先级介绍

层叠 层叠是 CSS 的核心机制,用于解决同一元素同一属性被多个样式声明设置时的冲突问题。浏览器按照严格的优先级规则,从低到高逐层比较,最终确定哪个声明生效。 术语解释 名次 解释 有三种层叠来源类型 用户代理样式表、用户样式表和作…...

紧固件模具是什么?生产工艺、类型及应用详解_FES上海紧固件展

2026第十六届上海紧固件专业展Fastener Expo Shanghai 2026将于6月24日至26日在国家会展中心(上海)举行。展会由上海上搜展览与华人螺丝网联合主办,并获得中国五矿化工进出口商会五金紧固件分会支持,整体展览规模约70,000平方米&a…...

探索p5.js Web Editor:重构创意编程体验的开发平台

探索p5.js Web Editor:重构创意编程体验的开发平台 【免费下载链接】p5.js-web-editor The p5.js Editor is a website for creating p5.js sketches, with a focus on making coding accessible and inclusive for artists, designers, educators, beginners, and …...

一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

基于yolov26的桃子成熟度检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

基于 PyQt5 和 YOLO26 的目标检测桌面应用程序,支持图片、视频和摄像头实时检测。 功能特性 图片检测:支持图片检测视频检测:支持视频文件实时检测与播放摄像头检测:支持实时摄像头视频流检测模型切换:支持加载不同的 …...

微软老员工称部分“被更新损坏“的电脑实际早已注定失败

据微软资深工程师雷蒙德陈表示,微软的系统更新并非总是客户设备损坏的罪魁祸首。有时这些设备早已存在问题,只是客户在补丁星期二重启尝试导致系统无法启动之前没有注意到。更新背后的真相陈在文章中写道:"我在企业产品支持部门的同事们…...

[源码开源] 被抄袭后我选择把 3w 用户日活千人的小游戏源码直接公开

小红书上最火的猜数字微信小程序游戏「谁输谁洗碗」开源啦,上线一个月累计注册用户超 3w ,支持双人对战的猜谜游戏,包含猜数字、猜颜色、每日挑战和残局解谜等多种游戏模式。 最近真的忙,辛苦做的游戏被人直接 1:1 照搬&#xff…...

LLM到Harness Engineering,我花一天时间捋清了这条技术链,终于搞懂了!

本文深入浅出地梳理了AI领域中的核心概念,从基础的大语言模型(LLM)、Token、Context、Prompt,到工具(Tool)、模型上下文协议(MCP),再到智能体(Agent&#xff…...

从 Agent 到 Skill:揭秘 AI 产品经理进阶的真正关键!

文章深入探讨了 AI 产品经理应如何理解和应用 Agent 与 Skill。文章指出,当前许多 AI 产品经理将注意力过度集中于 Agent,而忽略了 Skill 的重要性。实际上,Skill 是定义 Agent 在具体任务中行为、标准和质量的关键。文章详细阐述了 Skill 的…...

OFA图像描述系统实战:快速搭建图片转文字工具,避免常见权限错误

OFA图像描述系统实战:快速搭建图片转文字工具,避免常见权限错误 1. 项目介绍:让图片自己“说话”的智能工具 你有没有遇到过这样的场景?手头有一堆产品图片,需要为每张图配上文字描述,手动编写不仅耗时耗…...

嵌入式软件开发中的柔性数组机制

在嵌入式系统开发中,内存资源始终是最核心的约束之一。无论是微控制器还是低功耗控制终端,程序设计都必须在有限的存储空间中实现功能、效率与可靠性的平衡。因此,开发者不仅需要关注算法逻辑,还必须重视数据结构对内存的占用方式。 在这种背景下,柔性数组成为嵌入式软件…...

如何用xianyu_spider实现高效电商数据采集?从入门到精通的完整指南

如何用xianyu_spider实现高效电商数据采集?从入门到精通的完整指南 【免费下载链接】xianyu_spider 闲鱼APP数据爬虫 项目地址: https://gitcode.com/gh_mirrors/xia/xianyu_spider 在当今电商竞争日益激烈的环境下,获取准确、及时的市场数据成为…...

基于stm32单片机的智能导盲系统的设计与实现

一、摘要 为提高视障人群出行的安全性与便捷性,设计并实现一套基于STM32F103C8T6单片机的智能导盲系统。系统集成多种传感器与功能模块,能够实现环境感知、位置信息反馈、跌倒检测与紧急求助等功能。通过SR04超声波传感器实时监测前方障碍物,…...

Elsevier Tracker:学术审稿状态自动化追踪解决方案

Elsevier Tracker:学术审稿状态自动化追踪解决方案 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker Elsevier Tracker是一款开源Chrome插件,专为学术研究者设计,提供Elsevier期刊审…...

软件开发常见骗局有哪些?

虚假高薪招聘陷阱以“零经验高薪入职”“包就业”为噱头,要求求职者付费培训。实际培训内容质量低下,承诺的就业机会无法兑现,甚至诱导贷款支付培训费用。外包项目诈骗谎称有高额预算项目外包,要求开发者支付“保证金”或“预付款…...

PHP 8新特性盘点

PHP 8 新特性概览PHP 8 引入了多项重大改进和新功能,以下为关键特性总结:JIT 编译器即时编译:通过 JIT(Just-In-Time)编译器提升性能,尤其适用于 CPU 密集型任务。配置选项:在 php.ini 中可通过…...

thinkphp8官方文档

以下是ThinkPHP 8官方文档的核心内容和相关资源整理:官方文档入口ThinkPHP 8的官方文档可通过其官网访问,文档地址为:https://www.thinkphp.cn/doc主要文档内容ThinkPHP 8文档包含完整的框架使用指南,涵盖安装、配置、路由、控制器…...

原神帧率解锁终极指南:三步轻松突破60FPS限制

原神帧率解锁终极指南:三步轻松突破60FPS限制 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 还在为《原神》60帧限制感到困扰吗?genshin-fps-unlock是一款专为《…...

长生露模式系统开发

模式系统设计 长生露模式通常指结合健康管理、会员服务或直销体系的综合系统。开发需明确业务模式定位,如会员积分、分销奖励或健康数据追踪。核心模块包括用户分层、权益分配、数据分析和后台管理。技术架构选择 采用微服务架构确保系统可扩展性,推荐Sp…...

python 最基础的一些

获取数组长度 lengthlen(list)for 循环数组 for i in list:print (i)打出来的就是数组里的每一个数据。for 循环数组下标 for i in range(length):print(list[i])寻找某个数据在数组里的下标 indexnums[i1:].index(numNeed)i1因为是从i1开始找的,然后用index函数获取…...

机器人运动规划:轨迹规划算法核心综述

前言在机器人和自动驾驶领域,“路径规划”(Path Planning)和“轨迹规划”(Trajectory Planning)是两个常被提及的概念。路径规划:解决“怎么走”的问题,关注空间几何路径,不含时间属…...

基于51单片机的电子秤(4挡)proteus、原理图、流程图 1185-基于51单片机的电子秤...

基于51单片机的电子秤(4挡)proteus、原理图、流程图 1185-基于51单片机的电子秤(4挡)proteus、原理图、流程图、物料清单、仿真图、源代码 功能介绍: 1、基本部分 (1)称重范围用开关分为三挡&am…...