2026-10-25 23:13:42
MySQL事务日志通过redo log和undo log实现事务的原子性与持久性,是保障数据一致性和持久性的核心机制。其核心在于通过记录修改操作,确保系统崩溃或异常时能恢复到一致状态。以下是具体解析:
一、事务日志的作用事务日志主要解决ACID特性中的原子性(Atomicity)和持久性(Durability):
InnoDB存储引擎通过redo log(重做日志)和undo log(回滚日志)实现事务可靠性:
1. Redo Log(重做日志)顺序写:性能高,避免随机写数据文件。
循环写入:大小固定,写入后覆盖旧日志(log file group)。
持久化关键:提交事务时,redo log必须刷盘(由innodb_flush_log_at_trx_commit参数控制)。
MySQL重启时,读取redo log,将已提交但未写入磁盘的数据重新写入。
支撑WAL(Write-Ahead Logging)机制:日志先行,数据页更新可延迟刷盘。
事务回滚:执行ROLLBACK时,用undo log恢复数据到事务开始前的状态。
支持MVCC:允许不同事务看到各自所需的一致性视图。
存储位置:共享表空间或独立的undo表空间,生命周期由事务可见性决定。
事务修改数据前,生成undo log并写入内存缓冲区,随后刷盘。
回滚时,根据undo log逆向执行操作。
修改数据时,生成对应的undo log(用于回滚)和redo log(用于恢复)。
日志先写入内存中的日志缓冲区(log buffer),再根据策略刷盘。
redo log必须持久化到磁盘(确保持久性)。
数据页更新可延迟刷盘,由后台线程完成。
读取redo log,重放已提交事务的修改。
通过undo log回滚未提交事务的修改。
减少随机I/O,提升性能。
确保崩溃后数据一致性。
事务开始时,生成undo log。
修改数据时,生成redo log。
提交时,redo log刷盘;回滚时,undo log生效。
崩溃恢复:系统重启后,通过redo log恢复已提交事务,通过undo log清理未提交事务。
性能优化:WAL机制减少磁盘I/O,提升事务处理效率。
理解redo log和undo log的区别与协作,是掌握MySQL事务日志本质的关键。