MySQL学习笔记——undo log和redo log
undo log 和 redo log 是 MySQL InnoDB 存储引擎管理的数据日志类型,它们主要用于支持事务的 ACID 特性,即原子性、一致性、隔离性和持久性。
1.Undo Log(回滚日志)
undo log 用于支持事务的原子性(Atomicity)和隔离性(Isolation)。它在事务发生更改之前记录数据的原始状态,以便在事务回滚时能够将数据恢复到其原始状态。
工作原理:
- 当一个事务对数据库中的数据进行修改(如
INSERT
、UPDATE
或DELETE
操作)时,InnoDB 会先将原始数据的副本写入undo log
。 - 如果事务需要回滚(无论是由于用户请求还是由于系统错误),InnoDB 使用
undo log
将更改撤销,使数据恢复到事务开始之前的状态。 undo log
也用于实现 一致性非锁定读(Consistent Non-Locking Reads),这意味着在事务的隔离级别为 REPEATABLE READ 或 READ COMMITTED 时,可以提供一致的读取视图。
存储位置:
undo log
存储在专用的 回滚段(rollback segment) 中,通常位于与数据文件相同的表空间内。
2.Redo Log(重做日志)
redo log 用于支持事务的持久性(Durability)。它记录了已提交的事务对数据库进行的更改,这样在系统崩溃后可以通过重做这些日志来恢复数据。
工作原理:
- 在事务提交之前,所有的更改都会被写入
redo log
的日志缓冲区(redo log buffer
)。 - 当事务提交时,
redo log
缓冲区会刷新到磁盘上的redo log
文件。 - 如果数据库崩溃,在重启时,InnoDB 可以使用
redo log
来重新应用(重做)日志中的所有更改,以确保所有已提交的事务持久化到数据库中。
存储位置:
redo log
存储在专用的日志文件(通常为ib_logfile0
和ib_logfile1
)中,这些文件位于 InnoDB 的日志目录中。
本文只发表于博客园和tonglin0325的博客,作者:tonglin0325,转载请注明原文链接:https://www.cnblogs.com/tonglin0325/p/4743923.html