InnoDB: Concept: Redo Log

31st August 2020 at 3:14pm
InnoDB: Concept

Redo log 也叫 transaction log,是基于磁盘的、在崩溃恢复中用于 恢复未完成事务 的一种机制。MySQL 在重启时,InnoDB 会自动将 redo log 中未完成的事务重做一次

Redo log 的文件名为 ib_logfile0 ib_logfile1,文件数量和大小可配。采用一种 循环写 的机制(类似 on-disk ring buffer)。当一个事务被提交后,事务中相关的 log 会被批量 flush 到 data file 中,此时这些 log 在文件中的位置可以被新 log 覆盖写。

由于 doublewrite 保证了数据的完整性,因此 redo log 无需纪录变化后的完整数据,只纪录 数据变化的部分。官方文档的描述是:

... the redo log encodes requests to change table data that result from SQL statements or low-level API calls.

与 binlog 的差异

Redo log 是 InnoDB 引擎特有的日志。而 binlog 是 MySQL server 层提供的能力,并不区分存储引擎。

因此,Binlog 也不纪录未提交的事务。在崩溃恢复时,仅有 binlog 是无法恢复未提交的事务的,会导致数据丢失。

InnoDB's Buffers and Files

References

  • Redo Log - MySQL
  • The InnoDB transaction log, Chapter 8, High Performance MySQL, 3rd Edition