【腾讯面经】说说undolog、redolog、binlog的区别——给你最详细的比喻

58 阅读3分钟

数据库(以 MySQL 为例)中,undo log、redo log 和 bin log 是三种重要的日志机制,它们各自有不同的作用和特点。以下是它们的区别和功能,简洁清晰地说明:

1. Undo Log

  • 作用: 用于事务的回滚一致性读(MVCC,多版本并发控制)。

  • 功能:

    • 记录事务执行前的数据旧值,以便在事务失败或回滚时恢复到原始状态。
    • 支持 MVCC,提供事务隔离性(如读未提交、读已提交等),让不同事务读取一致的数据快照。
  • 存储位置: 通常存储在数据库的回滚段(rollback segment)中,属于 InnoDB 存储引擎的日志。

  • 特点:

    • 逻辑日志,记录的是数据的逻辑操作(如“修改前是 A,修改后是 B”)。
    • 仅在事务提交前有效,提交后可能会被清理(视 MVCC 需求)。
  • 使用场景: 事务回滚、崩溃恢复、一致性读。

2. Redo Log

  • 作用: 用于崩溃恢复,确保事务的持久性(Durability,ACID 中的 D)。

  • 功能:

    • 记录事务对数据的物理修改(如“在某个页面修改某条记录”)。
    • 在事务提交时,将修改写入 redo log,确保即使系统崩溃,数据也能恢复。
  • 存储位置: 存储在磁盘的物理日志文件中(如 InnoDB 的 ib_logfile),属于 InnoDB 存储引擎。

  • 特点:

    • 物理日志(或物理-逻辑日志),记录页面级别的修改。
    • 顺序写入,性能较高。
    • 提交事务后,redo log 会持久化到磁盘。
  • 使用场景: 数据库崩溃后恢复已提交事务的修改。

3. Bin Log

  • 作用: 用于主从复制数据恢复

  • 功能:

    • 记录所有对数据库的逻辑修改操作(如 INSERT、UPDATE、DELETE 的 SQL 语句或基于行的更改)。
    • 用于主从同步(主库将 bin log 传输到从库,保持数据一致)。
    • 可用于点-in-time 恢复(结合备份恢复到特定时间点)。
  • 存储位置: 存储在磁盘的二进制日志文件中(如 mysql-bin.000001),属于 MySQL Server 层,非特定存储引擎。

  • 特点:

    • 逻辑日志,记录的是 SQL 或行级修改。
    • 与存储引擎无关,适用于所有支持 bin log 的引擎。
    • 可配置为 statement-based、row-based 或 mixed 格式。
  • 使用场景: 主从复制、数据备份与恢复。

对比总结

特性Undo LogRedo LogBin Log
所属层InnoDB 存储引擎InnoDB 存储引擎MySQL Server 层
日志类型逻辑日志物理日志(或物理-逻辑)逻辑日志
主要作用事务回滚、一致性读崩溃恢复、持久性主从复制、数据恢复
记录内容数据修改前的旧值数据修改的页面级操作SQL 语句或行级修改
存储位置回滚段(内存+磁盘)物理日志文件(磁盘)二进制日志文件(磁盘)
持久性提交后可能清理持久化到磁盘持久化到磁盘
使用场景事务回滚、MVCC崩溃恢复主从同步、点-in-time 恢复

简单例子

假设执行 UPDATE table SET col = 10 WHERE id = 1:

  • Undo Log: 记录 id=1 的旧值(如 col=5),用于回滚或 MVCC。
  • Redo Log: 记录页面中 col 从 5 改为 10 的物理修改,用于崩溃恢复。
  • Bin Log: 记录 UPDATE 语句或行数据修改,用于主从复制或恢复。