MySQL基础-三大日志


1. Redo Log (重做日志)

  • 作用: Redo Log 是 InnoDB 存储引擎特有的日志,用于实现事务的 持久性(Durability)。它的主要目的是确保事务在提交后,即使发生数据库崩溃,数据也不会丢失
  • 记录内容: 它记录的是数据页(data page)上的物理修改,即“在某个数据页的某个偏移量上修改了什么值”。例如,“将第100页的第20字节到24字节从X改为Y”。
  • 工作原理(WAL - Write-Ahead Logging):
    1. 当事务提交时,MySQL 不会立即将所有修改的数据页从内存(Buffer Pool)刷写到磁盘。因为数据页是随机 I/O,效率较低。
    2. 相反,它会先将事务对数据页的修改记录到 Redo Log 中。Redo Log 是顺序写入的,这比随机 I/O 快得多。
    3. Redo Log 会先写入内存中的 Redo Log Buffer,然后根据配置(innodb_flush_log_at_trx_commit 等)周期性地刷写到磁盘上的 Redo Log 文件。
    4. 先写日志,再写数据。只要 Redo Log 记录了事务的修改并刷写到了磁盘,即使数据页还没来得及刷到磁盘数据库就崩溃了,系统也可以在重启时通过重放(Redo)Redo Log 中的记录来恢复数据,确保事务的完整性。
  • 恢复(Crash Recovery): 数据库重启时,会检查 Redo Log。如果发现有些事务的 Redo Log 已经提交但对应的数据页还没有写入磁盘,就会重放这些 Redo Log 来恢复数据到崩溃前的状态。
  • 文件形式: 通常是循环写入的固定大小文件组(如 ib_logfile0, ib_logfile1)。

2. Binlog (二进制日志)

  • 作用: Binlog 是 MySQL Server 层(而不是存储引擎层)的日志,因此它不限于 InnoDB 存储引擎,所有存储引擎都会产生 Binlog。它的主要用途是:
    1. 数据复制(Replication)/主从同步: 主数据库将 Binlog 传输给从数据库,从数据库重放 Binlog 来保持数据同步。
    2. 数据恢复(Point-in-Time Recovery): 可以根据 Binlog 将数据库恢复到某个特定的时间点,例如,在误操作后恢复到误操作之前的状态。
    3. 审计: 记录数据库的所有更改操作,用于安全审计。
  • 记录内容: 它记录的是逻辑操作,即 SQL 语句的逻辑修改内容,例如“对表 A 插入一行数据,值为 (1, ‘张三’)”或者“将表 B 中 id=5 的记录的 name 字段改为 ‘李四’”。
  • 日志格式:
    • Statement 格式: 记录 SQL 语句本身(例如 INSERT ..., UPDATE ...)。
    • Row 格式: 记录每一行数据的具体修改(例如,某行数据修改前的值和修改后的值)。这是更推荐和常用的一种格式,因为它更稳定,避免了 Statement 格式可能存在的“非确定性”问题。
    • Mixed 格式: 混合使用 Statement 和 Row 格式。
  • 刷写机制: 事务提交时,Binlog 也会被写入磁盘。通常会在事务提交的最后阶段写入。
  • 文件形式: 一系列按时间顺序递增的文件(如 mysql-bin.000001, mysql-bin.000002)。

3. Undo Log (回滚日志)

  • 作用: Undo Log 也是 InnoDB 存储引擎特有的日志,用于实现事务的 原子性(Atomicity)一致性(Consistency),以及 **MVCC (Multi-Version Concurrency Control) **。
  • 记录内容: 它记录的是数据被修改前的状态。例如,如果一条记录从值 A 修改为值 B,Undo Log 会记录“将值 B 改回值 A 的操作”。这可以理解为 Redo Log 的逆操作。
  • 工作原理:
    1. 当事务修改数据时,在修改数据之前,会将数据的旧版本写入 Undo Log。
    2. 如果事务需要回滚(ROLLBACK),系统会读取 Undo Log 中的记录,根据这些记录将数据恢复到事务开始前的状态,从而保证原子性。
    3. MVCC:Undo Log 也是实现 MVCC 的关键。当一个事务读取数据时,如果该数据正在被另一个事务修改,读取事务可以通过 Undo Log 找到该数据修改前的版本(快照),从而实现不加锁的读操作,提高并发性能。每个事务都会看到它自己启动时的数据视图。
  • 文件形式: Undo Log 存储在共享表空间(System Tablespace)或独立的 Undo Tablespace 文件中。
  • 生命周期: 事务提交后,Undo Log 不会立即删除,因为 MVCC 可能还需要它来提供旧版本的数据视图。当不再有任何事务需要它时,它才会被清理。

三者之间的关系和区别:

特性 Redo Log (重做日志) Binlog (二进制日志) Undo Log (回滚日志)
层级 InnoDB 存储引擎层 MySQL Server 层(独立于存储引擎) InnoDB 存储引擎层
目的 持久性:确保事务提交后数据不丢失(崩溃恢复) 复制、恢复、审计:主从同步、时间点恢复 原子性、一致性:事务回滚、MVCC
记录 物理修改:某个数据页的某个偏移量被修改 逻辑操作:SQL 语句或行数据更改的逻辑过程 逻辑修改的逆操作:数据修改前的状态(如何回滚)
写入 顺序写入 顺序写入 随机写入(为了记录旧版本数据)
刷盘 事务提交前刷盘(WAL) 事务提交后刷盘 事务提交时写入,但清理延迟
作用对象 数据页 整个数据库操作 数据行(旧版本)

在面试中,能够清晰地解释这三种日志的作用、原理和相互关系,将很好地展示你对 MySQL 数据库事务和数据一致性机制的深刻理解。


文章作者: foo1s
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 foo1s !
评论