redo log详解

在 MySQL 中,Redo Log(重做日志) 是 InnoDB 存储引擎实现事务持久性(ACID 中的 D) 的核心机制,同时也通过 “预写日志(Write-Ahead Logging, WAL)” 策略提升了数据写入性能。它记录的是数据页的物理修改操作(而非 SQL 逻辑),用于在数据库崩溃后恢复未持久化到磁盘的数据,避免事务丢失。

目录

核心作用

存储形式:文件组形式存储

写入方式:循环写入

写入策略:由innodb_flush_log_at_trx_commit参数控制

参数设置与查看

参数选型

写入流程

核心参数选型与设置

选型

查看与设置语法

配置注意事项

Redo Log 实际应用的常见误区

Redo Log 的核心实际应用场景


 

核心作用

Redo Log 的核心目标是解决 “内存数据与磁盘数据不一致” 的问题,具体有两大作用:

  • 保证事务持久性:即使数据库在事务提交后、数据未刷入磁盘前崩溃,重启后可通过 Redo Log 重新执行修改操作,将数据恢复到提交状态,避免事务 “提交了但数据丢了”。
  • 提升写入性能:InnoDB 的写入并非直接将数据刷入磁盘(磁盘随机写速度慢),而是先修改内存中的数据页(Buffer Pool),再异步将 Redo Log 刷入磁盘(顺序写速度快),后续由后台线程(如page cleaner)将内存数据批量刷盘,大幅降低磁盘 IO 开销。

存储形式:文件组形式存储

Redo Log 并非单文件,而是以日志文件组的形式存在(默认是ib_logfile0和ib_logfile1),文件大小和数量可通过配置调整:

配置参数核心作用默认值取值范围 / 限制生产环境建议值关键注意事项
innodb_log_file_size定义单个 Redo Log 文件的大小,决定单文件可存储的日志量48M- 最小值:无明确下限(通常不小于 1M)
- 最大值:单个文件无独立上限,但需满足 innodb_log_files_in_group * innodb_log_file_size ≤ 512G(整个日志文件组总大小上限)
2G - 4G1. 需平衡 “恢复速度” 与 “日志切换频率”:
- 过小:日志切换频繁,触发 Checkpoint 次数多,增加 IO 开销
- 过大:崩溃后扫描日志时间长,恢复速度慢
2. 修改需谨慎,需先停止 MySQL,删除旧日志文件后重启
innodb_log_files_in_group定义 Redo Log 文件组的文件数量,文件命名格式为 ib_logfile0ib_logfile1...2- 最小值:1
- 最大值:100
2 - 4 个1. 多文件通过 “循环写” 机制避免单文件损坏导致日志丢失,提升可靠性
2. 数量并非越多越好:过多文件会增加日志管理开销,2-4 个可满足绝大多数场景需求
3. 需与 innodb_log_file_size 配合,确保总大小不超过 512G

写入方式:循环写入

当一组文件写满后,会切换到下一个文件;全部写满后,会覆盖最早的日志(前提是这些日志对应的内存数据已刷入磁盘,即 “checkpoint” 完成)。

  • 核心指针:write pos(写入位置) 和checkpoint(检查点)
    用于管理 Redo Log 的写入、循环覆盖和失效日志清理,确保日志空间高效利用和数据安全。
    指针定义作用
    write pos(写入位置)记录当前 Redo Log 的下一个待写入位置(指向日志文件中即将写入新日志的位置)。标记日志的 已使用区域
    从 checkpoint 到 write pos 之间的区域,是已写入但尚未被覆盖的有效日志。
    checkpoint(检查点)记录已刷盘的日志位置(指向所有已写入 Redo Log 中,对应的数据页已刷入磁盘的最新位置)。标记日志的可覆盖区域
    从日志起始位置到 checkpoint 之间的区域,是已失效的日志(对应数据已持久化),可被新日志覆盖。
  • 循环写入分析
    redo log 从头开始写,写完一个文件继续写另一个文件,写到最后一个文件末尾就又回到第一个文件开头循环写,如下图所示:
    • 日志写入:事务产生的 Redo Log 从write pos位置开始写入,write pos随写入不断后移(顺时针移动)。如上图所示,write pos写到第 3 号文件末尾后就回到 0 号文件开头。
    • 日志覆盖:当write pos追上checkpoint时,说明日志文件组已写满,此时不能继续写入新日志,必须先触发 Checkpoint 机制,推动checkpoint后移(释放可覆盖区域),才能继续写入。
    • checkpoint 推进:当触发 Checkpoint(如日志快写满、脏页比例过高)时,InnoDB 会将 Buffer Pool 中 “checkpoint到write pos之间的日志对应的脏页” 刷入磁盘;刷盘完成后,checkpoint向后移动到最新位置,释放出的区域可被新日志覆盖。

写入策略:由innodb_flush_log_at_trx_commit参数控制

参数设置与查看

# 查看innodb_flush_log_at_trx_commit参数值:
show variables like 'innodb_flush_log_at_trx_commit';
# 设置innodb_flush_log_at_trx_commit参数值(也可以在my.ini或my.cnf文件里配置):
set global innodb_flush_log_at_trx_commit=1;  


参数选型

参数值含义与行为数据安全性性能表现适用场景
1事务提交时,强制将 Redo Log 从缓冲区(Redo Log Buffer)刷入磁盘(通过 fsync 系统调用确保物理写入)。最高:即使数据库崩溃或服务器断电,已提交事务的日志也不会丢失。较低:每次提交都触发磁盘 IO,对高频提交场景有性能影响。核心业务(如金融交易、订单支付),对数据一致性要求极高的场景。
0事务提交时,不刷盘,仅将 Redo Log 写入缓冲区;由后台线程每 1 秒批量将缓冲区日志刷入磁盘。较低:若数据库崩溃,可能丢失最后 1 秒内已提交的事务日志。最高:避免频繁磁盘 IO,适合写入密集型场景。非核心业务(如日志采集、临时数据存储),可接受少量数据丢失的场景。
2事务提交时,将 Redo Log 写入操作系统缓存(OS Cache),不触发 fsync;操作系统每 1 秒将缓存数据刷入磁盘。中等:若数据库崩溃,操作系统缓存中的日志不会丢失;若服务器断电,可能丢失操作系统缓存中的日志(通常不超过 1 秒)。中等:比 1 性能高(减少 fsync 开销),比 0 安全性高。对性能有一定要求,且允许极短时间数据丢失的场景(如电商商品评论、非实时统计)。

写入流程

核心参数选型与设置

选型

Redo Log 的参数配置直接影响数据库的性能可靠性崩溃恢复速度,以下是核心参数的选型建议:

参数名称功能描述可选值范围选型建议决策依据
innodb_log_file_size单个 Redo Log 文件大小1M ~ 512G(受总大小限制)生产环境:2G ~ 4G
小型应用:512M ~ 1G
- 过小:日志切换频繁,Checkpoint 触发频繁,IO 开销大
- 过大:崩溃恢复时间长
- 需满足:单个大小 × 文件数 ≤ 512G
innodb_log_files_in_groupRedo Log 文件数量1 ~ 100推荐:2 ~ 4 个(默认 2 个)- 数量过少:单文件损坏风险高
- 数量过多:管理开销增加,2-4 个足以平衡可靠性与性能
innodb_flush_log_at_trx_commit日志刷盘策略0、1、2核心业务:1
非核心业务:2
测试 / 日志系统:0
- 1(最安全):事务提交即刷盘,无数据丢失
- 2(折中):提交写 OS 缓存,秒级刷盘
- 0(最高性能):每秒批量刷盘,可能丢失 1 秒数据
innodb_log_buffer_sizeRedo Log 缓冲区大小默认 16M,最大无限制(通常≤1G)一般场景:默认 16M
大量短事务:64M ~ 256M
- 过小:频繁刷盘(尤其大事务)
- 过大:内存浪费,超过 256M 收益有限

查看与设置语法

# 查看
show variables like '参数名';
# 设置
set global 参数名=目标值;  

配置注意事项

选择配置时,需结合业务的数据安全等级、写入频率和硬件 IO 能力综合决策,建议先在测试环境验证后再应用到生产。以下为使用 redolog的常见注意事项。

  • 修改日志文件大小 / 数量的步骤
    1. 停止 MySQL 服务
    2. 删除旧日志文件(ib_logfile0、ib_logfile1等)
    3. 修改配置文件
    4. 重启 MySQL(自动生成新日志文件)
  • 总大小限制
    确保 innodb_log_files_in_group × innodb_log_file_size ≤ 512G,超出会导致启动失败。
  • 与其他参数的配合
    • 若innodb_flush_method = O_DIRECT(绕开 OS 缓存),innodb_flush_log_at_trx_commit=2等价于1的安全性
    • 高并发写入场景,建议配合innodb_buffer_pool_size调大内存缓存
  • 监控与调优
    |通过SHOW ENGINE INNODB STATUS查看日志使用情况,若Log sequence number与Log flushed up to差距过大,可能需要调大innodb_log_buffer_size。

Redo Log 实际应用的常见误区

  • 误区 1:认为 “日志文件越大越好”
    • 错误认知:部分运维人员为减少切换频率,将 innodb_log_file_size 设为 16G 甚至更大。
    • 风险:崩溃恢复时间会急剧增加(如 16G 的日志文件,恢复可能需要 30 分钟以上),若业务要求 “快速恢复”,会导致长时间服务不可用。
    • 正确做法:单个文件大小不超过 4G,总大小控制在 16G 以内(除非业务对恢复时间无要求)。
  • 误区 2:所有业务都用 innodb_flush_log_at_trx_commit=1
    • 错误认知:为 “绝对安全”,即使是非核心业务(如日志)也强制使用 1。
    • 问题:fsync() 操作会导致大量磁盘 IO 开销,写入性能下降 30%~50%,浪费硬件资源。
    • 正确做法:根据业务优先级选择刷盘策略,非核心业务用 2 或 0,平衡性能与安全。
  • 误区 3:忽略 Redo Log 与硬件的配合
    • 错误认知:只调优参数,不关注磁盘类型。
    • 问题:若 Redo Log 存储在机械硬盘(HDD)上,即使参数优化,顺序写性能也有限(HDD 顺序写速度约 100MB/s);若存储在 SSD 上,未开启 innodb_flush_method=O_DIRECT,会导致 OS 缓存与 SSD 缓存叠加,增加延迟。
    • 正确做法:
      • Redo Log 优先存储在 SSD 上,利用其高 IOPS 特性;
      • 开启 innodb_flush_method=O_DIRECT,绕开 OS 缓存,直接写入 SSD,减少延迟(需注意:此时 innodb_flush_log_at_trx_commit=2 等价于 1 的安全性,因为 SSD 掉电保护可避免 OS 缓存数据丢失)。

Redo Log 的核心实际应用场景

  • 支撑高并发写入业务
    在电商秒杀、支付交易、日志采集等高频写入场景中,Redo Log 是性能保障的关键:
    • 原理:事务执行时,InnoDB 先将 “数据修改记录”(如 “表 t1 的 id=1 行,name 从 A 改为 B”)写入 Redo Log Buffer(内存缓冲区),再通过 “刷盘策略” 写入磁盘上的 Redo Log 文件(顺序写,速度远快于数据页的随机写);事务提交后,无需等待数据页立即刷盘,只需确保 Redo Log 已刷盘(即 “WAL 原则”)。
    • 实际效果:将 “数据页随机写” 转化为 “Redo Log 顺序写”,写入性能提升 10~100 倍,支撑每秒数万次的事务写入。
  • 崩溃恢复(Crash Recovery)
    数据库意外宕机(如断电、进程崩溃)后,重启时 InnoDB 会通过 Redo Log 恢复数据,避免事务丢失:
    • 恢复流程:
      1. 读取 Redo Log 文件中 “未刷盘到数据页” 的事务记录(通过 Log Sequence Number 即 LSN 匹配,LSN 是 Redo Log 和数据页的 “版本标识”);
      2. 重新执行这些记录,将数据恢复到宕机前的状态;
      3. 对 “未提交但已写入 Redo Log” 的事务,通过 Undo Log 回滚,确保数据一致性。
    • 实际价值:金融、支付等核心业务依赖此机制实现 “零数据丢失”(需配合 innodb_flush_log_at_trx_commit=1)。
  • 减少数据页刷盘频率
    InnoDB 的数据页(默认 16KB)刷盘成本高,Redo Log 允许数据页 “延迟刷盘”:
    • 原理:事务修改数据时,先更新内存中的 “缓冲池(Buffer Pool)数据页”,并记录 Redo Log;数据页只需在 “缓冲池满”“Checkpoint 触发” 或 “定时任务” 时刷盘,无需每次事务提交都刷盘。
    • 实际影响:减少磁盘 IO 次数,尤其在 “大量短事务” 场景中,可显著降低 IO 压力。

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

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

相关文章

Linux awk命令完全指南:从原理到实战,搞定文本处理难题

在Linux世界里,文本处理是运维、开发绕不开的日常——从分析日志、提取配置信息到统计数据,都需要高效的工具支撑。而awk,作为一款强大的文本分析语言,凭借“按字段处理”的核心能力,成为了比grep(单纯匹配…

毕业项目推荐:68-基于yolov8/yolov5/yolo11的水稻虫害检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全(可点击查看,不定时更新中)概要一、整体资源介绍技术要点功能展示:功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出(xls格式…

Qt为什么要引入QML语言?

Qt发布于1991年,经过30多年的发展,Qt/C已经成为了众多学子,拿来学习C的首选框架。Qt/Widgets,相对于其他界面库(如GNOME、KDE),其实已经很优秀,已经可以成为number one了。在已经是第…

设计模式在Java中的应用:从单例模式到工厂模式的全面解析!

全文目录:开篇语前言1. 单例模式:确保全局只有一个实例1.1 饿汉式单例1.2 懒汉式单例1.3 双重检查锁定(DCL)2. 工厂模式:简化对象创建2.1 简单工厂模式2.2 工厂方法模式2.3 抽象工厂模式3. 其他设计模式3.1 观察者模式…

Meta AIUCSD放大招:DeepConf 让大语言模型推理既快又准,84.7%的token节省+近乎完美的准确率!

1. 【前言】 Meta&UCSD 大语言模型(LLMs) 在推理任务中通过自一致性等测试时缩放方法展现出巨大潜力,但存在精度收益递减和计算开销高的问题。为此,Meta与UCSD的研究人员提出DeepConf方法,它利用模型内部的置信度信…

解决leetcode第3671.子序列美丽值求和问题

3671. 子序列美丽值求和难度:困难问题描述:给你一个长度为 n 的整数数组 nums。对于每个 正整数 g,定义 g 的 美丽值 为 g 与 nums 中符合要求的子序列数量的乘积,子序列需要 严格递增 且最大公约数(GCD)恰…

电机控制(一)-电机分类

电机分类 电机分类: 电机的拓扑模型并没有发生太大变化,变化较大的是控制电机的方法。 常见的电机类型有: 步进电机vs伺服电机 在工业自动化、机器人、精密设备等领域,步进电机和伺服电机是两种最常用的驱动电机,但两者的核心…

【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法 QToolBar 是 Qt 中用于创建工具栏的控件,可快速放置常用功能按钮、分隔符或自定义控件,并支持拖动停靠、浮动等特性。 1. 基础创建与添加到主窗口 // 在 QMainWindow 中创建工具栏 QToolBar *toolBar new QToolBar(tr("主工…

DVWA靶场通关笔记-验证码绕过Insecure CAPTCHA (Impossible级别)

目录 一、reCAPTCHA 1、配置security为Impossible级别。 2、配置RECAPTCHA参数 3、再次打开靶场 二、源码分析 1、index.php 2、impossible.php 3、功能函数 三、reCAPTCHA 防范分析 1、严格的参数验证与处理 2、预处理防止SQL注入 3、CAPTCHA 验证通过 4、验证当前…

MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)

1.安装MySQL 1.1更新系统的软件包列表 sudo apt-get update1.2安装MySQL服务器 sudo apt-get install mysql-server1.3检查MySQL服务是否启动,若没有启动手动启动若没有启动执行: sudo service mysql start1.4登录MySQL(默认安装之后不需要密…

Streamlit 数据看板模板:非前端选手快速搭建 Python 数据可视化交互看板的实用工具

你想想看,平时你用 Python 跑出来一堆数据 —— 比如用户留存率、产品销量变化,想给领导或者同事看,总不能直接发个 CSV 文件或者一堆静态图吧?对方看的时候还得自己翻数据,想对比下上个月和这个月的变化都费劲&#x…

FMC、FMC+ 详解

文章目录FMC 简介FMC 引脚输出定义High-pin count (HPC) connector, HPC pinoutLow-pin count (LPC) connector, LPC pinoutPin and signal descriptionFMC 简介VITA57 标准更新历史VITA57.4 标准推出的原因FMC 引脚输出定义Altera 开发板的 FMC 引脚定义英特尔 Arria 10 GX FP…

小迪web自用笔记24

黑名单机制。如果被过滤可以试试PHP5看看过滤没(或者其他变种变形),但是得看环境有些环境会被当成下载,有些会直接打开。白名单机制只允许这几个特定后缀可以上传,比黑名单更安全。直接从信息图中获取文件类型。文件类…

私有部署问卷系统、考试系统、投票系统、测评系统的最佳选择-调问开源问卷表单(DWSurvey)

在选择私有部署问卷系统的时候,调问问卷系统(DWSurvey)是一定要尝试一下,而且可以应用到私有部署考试系统、私有部署投票系统、私有部署测评系统等多个应用场景。 私有部署问卷、考试、测评、投票系统的优势不言而喻,就拿私有部署考试系统来说…

企业实用——MySQL的备份详解

序言: 本次基于mysql8.0.40来给大家做数据库的备份的实用技巧和思路!对于mysql基础的部分后续我会节选部分给大家讲解,本篇文章适合有一定数据库基础的小伙伴看。 目录 一、MySQL备份概述 1、关于数据保存你要知道 2、到底要备份什么 备份什么 MySQL体系结构(MySQL =…

使用 FunASR 工具包实现音频文件的语音识别

使用 FunASR 工具包实现音频文件的语音识别,并将识别结果保存为文本文件,支持单文件处理和批量处理。电脑环境需要配置,我使用的PyTorch版本: 2.4.1cu121,CUDA可用: True。FunASR 是一个功能强大、性能卓越、面向工业应用的语音识…

【STM32】定时器编码器接口

【STM32】定时器编码器接口一、编码器接口1.1 正交编码器1.2 编码器接口基本结构1.3 工作模式二、编码器接口测速一、编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT的自增或…

浪潮科技Java开发面试题及参考答案(120道题-中)

请介绍一下 SpringMVC 的运行流程?从用户发送请求到响应返回的完整步骤是什么?SpringMVC 是基于MVC架构的Web框架,其运行流程围绕“前端控制器(DispatcherServlet)”展开,通过多个组件协同工作,…

k8s初始化常见问题

执行初始化:kubeadm init --apiserver-advertise-address192.168.88.110 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr10.244.0.0/16 --control-plane-endpointweb01报错信息:age-repository registry.aliyuncs.com/…

Python学习笔记--使用Django修改和删除数据

一、修改方式一:模型类的对象.属性 更改的属性值,模型类的对象.save()返回值:编辑的模型类的对象。def update_book(request):book models.Book.objects.filter(pk1).first()book.price "169"book.save()return HttpResponse(bo…