2026-05-22 20:59:03
MySQL中事务的持久性通过InnoDB引擎的redo log机制实现,其核心原理是预写式日志(WAL,Write-Ahead Logging),即数据修改先写入日志文件,再异步刷盘到数据页。以下是具体实现原理的分步说明:

redo log结构
内存部分(redo log buffer):易失性,缓存未刷盘的日志。
磁盘部分(redo log file):持久化存储,循环使用固定大小的文件(如ib_logfile0、ib_logfile1)。
写入过程
步骤1:事务修改Buffer Pool中的数据页,标记为脏页。
步骤2:生成对应的redo log记录,写入redo log buffer。
步骤3:事务提交时,将redo log buffer刷盘到redo log file(fsync),确保日志持久化。
步骤4:后台线程择机将脏页刷盘到数据文件。
初始化MTR时分配内存缓冲区(mtr_buf)。
修改Buffer Pool中的数据页,同时生成redo log记录到mtr_buf。
提交MTR时,将mtr_buf中的日志刷入redo log buffer,并将脏页加入flush list。
日志按512字节对齐包装为log block,便于刷盘。
关键点:先修改Buffer Pool,后写redo log buffer,但事务提交时redo log必须先落盘(WAL)。
五、崩溃恢复流程恢复优势:
刷脏页是随机I/O,而redo log是顺序I/O,速度更快。
仅记录修改部分,减少无效I/O。
事务提交时仅需保证redo log落盘,无需等待耗时的刷脏操作。
崩溃后可通过redo log完全恢复数据,确保持久性。
MySQL通过redo log的WAL机制,在事务提交时优先持久化日志,再异步刷脏页,平衡了性能与可靠性。其核心逻辑包括:
这一设计使InnoDB在保证事务持久性的同时,显著提升了高并发场景下的写入性能。