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

【MySQL】第9节|Innodb底层原理与Mysql日志机制深入剖析(二)

在 MySQL 中,redo logundo log 和 binlog 是三种不同类型的日志,分别服务于不同的数据库特性(如事务原子性、持久性、一致性,以及数据备份、恢复、复制等)。以下从功能、原理、区别和联系四个方面详细分析:

一、基本概念与功能

1. redo log(重做日志)
  • 所属模块:InnoDB 存储引擎(仅 InnoDB 支持,MyISAM 无此机制)。
  • 本质:物理日志,记录数据页的物理修改操作(如“将某个数据页的第 10 行字段 A 的值从 1 改为 2”)。
  • 作用
    • 实现事务的持久性(Durability):确保事务提交后,数据变更即使未写入磁盘也不会丢失(通过 redo log 持久化,配合 InnoDB 的 WAL 机制(Write-Ahead Logging),先写日志再写数据)。
    • 崩溃恢复(Crash Recovery):当数据库异常重启时,通过 redo log 重做未持久化到磁盘的事务,保证数据不丢失。
  • 特点
    • 顺序写入磁盘(效率高),默认写入 ib_logfile1ib_logfile2 等文件(路径由 innodb_log_group_home_dir 配置)。
    • 日志大小固定,循环使用(通过 innodb_log_file_size 和 innodb_log_files_in_group 控制)。
2. undo log(回滚日志)
  • 所属模块:InnoDB 存储引擎(仅 InnoDB 支持)。
  • 本质:逻辑日志,记录数据修改前的镜像(即“反向操作”,如“修改前字段 A 的值为 1”)。
  • 作用
    • 实现事务的原子性(Atomicity):当事务需要回滚时,通过 undo log 撤销未提交的修改。
    • 支持 MVCC(多版本并发控制):在读取数据时,通过 undo log 构建数据的历史版本,避免锁竞争,提升并发性能。
    • 一致性读(快照读):SELECT 语句默认读取的是数据的可见版本(通过 undo log 生成),而非实时锁数据。
  • 特点
    • 存储在 InnoDB 的系统表空间(ibdata 文件)或独立表空间(由 innodb_undo_tablespaces 配置)。
    • 事务提交后,undo log 不会立即删除,而是进入** purge 队列**,由后台线程定期清理(可通过 innodb_purge_delay 控制清理频率)。
3. binlog(二进制日志)
  • 所属模块:MySQL Server 层(所有存储引擎共享,包括 InnoDB、MyISAM 等)。
  • 本质:逻辑日志,记录所有修改数据的操作(如 INSERT、UPDATE、DELETE,以及部分 DDL 语句)。
  • 作用
    • 主从复制(Replication):主库将 binlog 传输给从库,从库解析并执行以保持数据同步。
    • Point-in-Time 恢复:通过 binlog 记录的操作,可将数据库恢复到某个历史时刻(需结合全量备份)。
  • 特点
    • 记录格式有三种:STATEMENT(记录 SQL 语句)、ROW(记录行级数据变更)、MIXED(混合模式)。
    • 日志文件默认名为 mysql-bin.xxxxxx(路径由 log_bin 配置),大小无固定限制,可通过 expire_logs_days 设置过期时间。
    • 仅记录提交的事务(未提交的事务不会写入 binlog)。

二、核心区别对比

维度

redo log

undo log

binlog

所属层

InnoDB 存储引擎层

InnoDB 存储引擎层

MySQL Server 层

日志类型

物理日志(数据页修改)

逻辑日志(回滚/版本信息)

逻辑日志(SQL 或行级操作)

是否跨引擎

仅 InnoDB 支持

仅 InnoDB 支持

所有引擎通用

记录内容

数据页的物理变更(如页号、偏移量、数据)

数据修改前的旧值(用于回滚和 MVCC)

SQL 语句或行级变更(如前后行数据)

主要用途

事务持久化、崩溃恢复

事务回滚、MVCC

主从复制、数据恢复

写入时机

事务提交时(可通过 innodb_flush_log_at_trx_commit控制)

数据修改前生成(与事务执行并行)

事务提交时(两阶段提交保证一致性)

文件特性

固定大小,循环覆盖

动态增长,定期清理(purge)

可配置自动拆分、过期策略

是否加密

否(需通过表空间加密间接实现)

否(依赖表空间加密)

是(可通过 binlog_encryption 配置)

三、联系与协作

  1. 在事务中的协作
    • 事务提交流程
      1. InnoDB 先将数据修改记录到 redo log(处于 prepare 状态)。
      2. MySQL Server 将操作记录到 binlog(完整写入)。
      3. InnoDB 提交事务(将 redo log 标记为 commit 状态)。

此流程称为 两阶段提交(Two-Phase Commit),确保 redo log 和 binlog 的数据一致性,避免因崩溃导致日志不一致(如“redo 已提交但 binlog 未记录”或反之)。

    • 回滚机制

事务执行过程中产生的临时修改会记录到 undo log,若事务回滚,直接通过 undo log 撤销修改,无需操作 redo log 和 binlog(未提交的事务不会写入 binlog)。

  1. 在崩溃恢复中的协作
    • 数据库重启时,InnoDB 首先通过 redo log 重做(Redo)所有已提交但未写入磁盘的事务。
    • 然后通过 undo log 回滚(Undo)所有未提交的事务(此时 binlog 中无这些事务记录)。
    • binlog 不参与崩溃恢复的直接操作,但在基于备份的恢复中,需结合 binlog 重做后续操作。
  2. 对 MVCC 的支持
    • undo log 生成数据的历史版本,redo log 确保版本数据的持久化,而 binlog 记录最终提交的版本变更,三者共同保障并发场景下的一致性和性能。

四、典型应用场景

场景

涉及日志

说明

事务提交后断电恢复

redo log

通过 redo log 重做未写入磁盘的事务,保证数据不丢失。

事务回滚(ROLLBACK)

undo log

通过 undo log 撤销未提交的修改,释放锁资源。

主从复制延迟排查

binlog(ROW 格式)

分析主库 binlog 生成速度与从库应用速度,定位复制瓶颈。

误删数据恢复(PITR)

全量备份 + binlog

先恢复备份,再通过 binlog 重做备份之后的操作,恢复到指定时间点。

高并发读场景

undo log + redo log

undo log 提供 MVCC 快照,redo log 保证数据持久化,避免读锁影响性能。

五、总结

  • redo log 是 InnoDB 实现事务持久性的核心,通过 WAL 机制提升写入性能,并保障崩溃恢复。
  • undo log 是 InnoDB 实现事务原子性和 MVCC 的基础,用于回滚和版本控制。
  • binlog 是 MySQL 层面的通用日志,服务于数据备份、复制和恢复,与存储引擎解耦。
  • 三者通过 两阶段提交和事务生命周期紧密协作,共同支撑 MySQL 的事务特性、数据一致性和可用性。合理理解和配置这三类日志,对数据库性能优化、故障排查和容灾架构设计至关重要。

相关文章:

  • Jetpack Compose 中更新应用语言
  • 【MySQL】第10节|MySQL全局优化与Mysql 8.0新增特性详解
  • Docker核心技术:Docker原理之Union文件系统
  • Google 推出 Flow —— AI 电影制作新平台
  • 在vue中重复组件导入简化方案
  • 【Leetcode 每日一题】2131. 连接两字母单词得到的最长回文串
  • 校园二手交易系统
  • Java详解LeetCode 热题 100(21):LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II)详解
  • 【计算机网络】基于TCP进行socket编程——实现客户端到服务端远程命令行操作
  • DAY36
  • 【MySQL】第十一弹——JDBC编程
  • PHP学习笔记(十)
  • 特征预处理
  • QML混合编程图像刷新策略
  • JavaSE核心知识点03高级特性
  • JavaScript数据类型及内置函数详解目录
  • 【MYSQL】索引、存储引擎
  • Next.js V15 在异步页面中,获取路由动态参数的几个坑
  • 【二刷力扣】【力扣热题100】今天的题目是:283.移动零
  • 2025.5.22 Axure 基础与线框图制作学习笔记
  • 建材行业网站建设方案/做网站需要多少钱 都包括什么
  • 上海公司注册代理公司/杭州网站seo价格
  • 网站设计方案案例分析/网站建设推广服务
  • 宁波建设系统网站/免费国外ddos网站
  • 做网站开发学什么语言/国际站seo优化是什么意思
  • 如何做手机网站/网站百度权重