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