MySQL 中的 binlog、redolog 和 undolog

115 阅读3分钟

MySQL 中的 binlogredologundolog 是三种核心日志,分别服务于不同场景,共同保障数据库的 ​ACID 特性​(原子性、一致性、隔离性、持久性)、高可用性数据恢复能力。以下是详细对比:

📊 ​一、核心区别总结​

维度

Binlog (二进制日志)​

Redolog (重做日志)​

Undolog (回滚日志)​

定位

Server 层日志,​所有引擎通用

InnoDB 引擎层日志,​仅 InnoDB 支持

InnoDB 引擎层日志,​仅 InnoDB 支持

内容

逻辑日志​:记录的 SQL 语句或行变更数据

物理日志​:数据页的修改细节(如偏移量、值)

逻辑日志​:修改前的数据状态(用于回滚)

核心作用

数据备份、主从复制、时间点恢复

崩溃恢复​:保证已提交事务的持久性(Crash-Safe)

事务回滚​ 和 ​MVCC 快照读

生命周期

追加写入,长期保留(可配置过期)

循环写入,空间重用(类似“环形缓冲区”)

事务提交后由后台线程清理

写入时机

事务提交时一次性写入

事务进行中持续写入(WAL 机制)

数据修改记录

是否必选

可关闭,但影响复制和恢复

InnoDB 事务的核心组件,不可关闭

InnoDB 事务的核心组件,不可关闭

⚙️ ​二、核心机制详解​

​1. Binlog (Binary Log)​​

  • 功能场景

    • 主从复制​:从库通过解析主库的 binlog 实现数据同步
    • 数据恢复​:结合全量备份 + binlog 实现时间点恢复(如误删数据回滚)
    • 审计​:记录所有 DDL/DML 操作历史
  • 记录格式

    • Statement​:记录原始 SQL(日志量小,但可能主从不一致)
    • Row​:记录每行数据变更(精度高,但日志量大)
    • Mixed​:混合模式,自动选择最优格式
  • 关键特性

    • 通过 sync_binlog 参数控制刷盘策略(0/1/N),平衡性能与安全

​2. Redolog (Redo Log)​​

  • 崩溃恢复原理 (Crash-Safe)​

    • 事务提交时,​先写 redolog​(顺序写),再异步刷脏页到磁盘(随机写)
    • 宕机重启后,根据 redolog 重放未落盘的脏页修改,保证持久性
  • 写入优化 (WAL 技术)​

    • 顺序 I/O​:redolog 追加写入,比数据页随机写快 10~100 倍
    • 缓冲机制​:先写入内存 redo log buffer,通过后台线程或事务提交刷盘
  • 空间管理

    • 默认 2 个文件(ib_logfile0, ib_logfile1),循环写入
    • 写满时触发 ​Checkpoint​:强制刷脏页释放空间

​3. Undolog (Undo Log)​​

  • 事务回滚机制

    • 记录修改前的数据镜像(如 UPDATE 前值、DELETE 对应 INSERT
    • 回滚时通过反向操作恢复数据
  • MVCC 实现

    • 为每个修改记录维护版本链​(通过 trx_id + roll_pointer
    • 快照读(如 SELECT)根据 Read View 判断可见版本,避免加锁
  • 清理机制

    • 事务提交后,undo log 由后台 purge 线程清理

🔄 ​三、协同工作场景​

​事务提交过程(二阶段提交)​​

  1. Prepare 阶段​:
    • 写 redolog(标记为 Prepare 状态)
    • 写 undolog(记录回滚信息)
  2. Commit 阶段​:
    • 写 binlog(Server 层)
    • 提交 redolog(标记为 Commit)

✅ ​目的​:确保 binlog 和 redolog 的一致性,避免主从不一致或数据丢失。

​崩溃恢复流程​

  1. 检查 redolog 中的 ​Prepare 但未 Commit​ 的事务
  2. 对比 binlog:
    • 若 binlog 存在该事务,重放 redolog 提交修改
    • 若 binlog 不存在,用 undolog 回滚事务

💎 ​四、总结与适用场景​

  • Binlog​:跨引擎的数据复制与恢复(如主从架构、误操作恢复)
  • Redolog​:InnoDB 崩溃恢复的核心,用 ​顺序 I/O 换高性能与持久性
  • Undolog​:支撑 ​事务原子性​ 和 ​MVCC 并发控制,避免读写阻塞

⚠️ ​性能提示​:

  • 高频写入场景可调优 innodb_flush_log_at_trx_commit(redolog 刷盘策略)和 sync_binlog(binlog 刷盘策略)
  • Undolog 版本链过长可能影响快照读效率,需监控长事务

三者各司其职,共同构建 MySQL 高可靠、高并发的基石。理解其差异,有助于针对性优化数据库架构与配置。