MySQL学习笔记——undo log和redo log

undo log 和 redo log 是 MySQL InnoDB 存储引擎管理的数据日志类型,它们主要用于支持事务的 ACID 特性,即原子性、一致性、隔离性和持久性。

1.Undo Log(回滚日志)

undo log 用于支持事务的原子性(Atomicity)和隔离性(Isolation)。它在事务发生更改之前记录数据的原始状态,以便在事务回滚时能够将数据恢复到其原始状态。

工作原理:

  • 当一个事务对数据库中的数据进行修改(如 INSERTUPDATEDELETE 操作)时,InnoDB 会先将原始数据的副本写入 undo log
  • 如果事务需要回滚(无论是由于用户请求还是由于系统错误),InnoDB 使用 undo log 将更改撤销,使数据恢复到事务开始之前的状态。
  • undo log 也用于实现 一致性非锁定读(Consistent Non-Locking Reads),这意味着在事务的隔离级别为 REPEATABLE READREAD 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_logfile0ib_logfile1)中,这些文件位于 InnoDB 的日志目录中。
posted @ 2015-08-20 00:24  tonglin0325  阅读(273)  评论(0编辑  收藏  举报