MySQL三大日志系统浅谈

MySQL的三大日志系统(binlog、undolog、redolog)是保证数据库事务特性(ACID)、数据恢复和高可用性的核心组件。下面详细解析它们的作用、原理和协作机制。


一、Redo Log(重做日志)

作用

  • 故障恢复 :确保事务的持久性(Durability),防止数据丢失。

  • 提高性能:将随机磁盘写(数据页修改)转换为顺序写(redolog追加),减少事务提交时的刷盘等待。

原理

  1. 物理日志:记录的是物理数据页的修改(如"在数据页A的偏移量B处写入数据C")。

  2. 循环写入 :固定大小文件组(如 ib_logfile0ib_logfile1),循环覆盖写入。

  3. Write-Ahead Logging(WAL):先写日志再写磁盘,数据变更先写入redolog和内存(Buffer Pool),再定期刷盘。

  4. 刷盘时机

    • 事务提交时(innodb_flush_log_at_trx_commit=1 保证每次提交刷盘)。

    • Redolog缓冲区满或定期刷新。

工作流程

复制代码
事务修改数据 → 写入Buffer Pool(内存) → 生成Redo Log到Log Buffer → 刷盘到Redo Log文件 → 异步将脏页刷回磁盘

二、Undo Log(回滚日志)

作用

  1. 事务回滚 :支持事务的原子性(Atomicity),回滚时反向取消修改。

  2. MVCC(多版本并发控制):提供数据的历史版本,实现非锁定读(一致性读)。

原理

  1. 逻辑日志:记录与操作相反的SQL逻辑(如INSERT对应DELETE,UPDATE记录旧值)。

  2. 存储在系统表空间/独立undo表空间:MySQL 8.0默认独立undo表空间。

  3. 版本链 :每行数据隐藏字段(DB_TRX_IDDB_ROLL_PTR)指向Undo Log记录,形成版本链。

  4. 生命周期:事务结束后不会立即删除,可能被MVCC或回滚需求引用,由purge线程清理。

工作流程

复制代码
事务修改数据前 → 生成Undo Log记录旧值 → 修改Buffer Pool数据 → 事务回滚时使用Undo恢复

三、Binlog(归档日志)

作用

  1. 主从复制:主库将Binlog同步到从库,从库重放实现数据同步。

  2. 数据恢复:基于时间点的数据恢复(PITR)。

  3. 数据归档:记录所有数据变更逻辑。

原理

  1. 逻辑日志 :记录SQL语句或行变更逻辑(STATEMENT/ROW/MIXED格式)。

  2. 追加写入 :文件持续追加,通过max_binlog_size切分文件。

  3. 同步机制 :通过sync_binlog参数控制刷盘策略。

  4. 两阶段提交:与Redo Log协作保证事务一致性(见下文)。


四、三大日志的协作流程(以事务提交为例)

两阶段提交(2PC)

为保证Redo Log和Binlog的一致性,MySQL使用内部两阶段提交:

复制代码
1. 准备阶段:
   - 写入Undo Log(用于回滚)
   - 写入Redo Log(状态为prepare)
   - 修改Buffer Pool数据

2. 提交阶段:
   a. 写Binlog(完整事务记录)
   b. 提交Redo Log(状态改为commit)
   c. 事务完成返回客户端

崩溃恢复逻辑

  • 如果Redo Log为prepare且Binlog完整 → 提交事务。

  • 如果Redo Log为prepare但Binlog不完整 → 回滚事务。


五、核心对比

日志类型 所属层 日志性质 作用 生命周期
Redo Log InnoDB引擎 物理日志 崩溃恢复,保证持久性 循环覆盖
Undo Log InnoDB引擎 逻辑日志 事务回滚,MVCC 事务结束后延迟清理
Binlog MySQL Server 逻辑日志 主从复制,数据归档 全量历史,可配置保留

六、配置要点

Redo Log

bash 复制代码
innodb_log_file_size = 1G      # 单个文件大小
innodb_log_files_in_group = 2  # 文件数量
innodb_flush_log_at_trx_commit = 1  # 每次提交刷盘

Binlog

bash 复制代码
server_id = 1
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW            # 推荐ROW格式
sync_binlog = 1                # 每次提交同步
expire_logs_days = 7           # 自动清理

Undo Log

bash 复制代码
innodb_undo_tablespaces = 2    # MySQL 8.0默认独立undo表空间
innodb_max_undo_log_size = 1G

七、总结

  • Redo Log :InnoDB的"急救包",保证数据不丢失,物理层面恢复。

  • Undo Log:事务的"后悔药",实现原子性和MVCC。

  • Binlog:MySQL的"时光机",用于数据复制和逻辑恢复。

三者协同工作,构成了MySQL高可靠、高可用的数据管理基石。理解它们的设计,有助于优化数据库性能和数据安全策略。

相关推荐
_F_y5 小时前
MySQL用C/C++连接
c语言·c++·mysql
pengdott5 小时前
Oracle RAC内存融合技术深度解析:集群性能的幕后引擎
数据库·oracle
csudata6 小时前
绿色便携版PostgreSQL发行版重磅发布
数据库·postgresql
阳光九叶草LXGZXJ6 小时前
达梦数据库-学习-48-DmDrs控制台命令(同步之Manager、CPT模块)
linux·运维·数据库·sql·学习
五岳7 小时前
DTS按业务场景批量迁移阿里云MySQL库实战(上):技术选型和API对接
mysql·阿里云·dts
我科绝伦(Huanhuan Zhou)7 小时前
脚本再升级,兼容Oracle 26ai一键安装
数据库·oracle
野生绿箭侠7 小时前
Ncos 2.3.2 版本集成达梦数据库
数据库
仍然.8 小时前
MYSQL--约束
数据库·mysql
乡野码圣8 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
亓才孓8 小时前
[数据库]应该注意的细节
数据库·sql