Mysql DBA学习笔记(Redo Log/Undo Log)
一、事务定义
事务:一组操作的集合,不可分割,这些操作要么全部成功执行,要么全部失败回滚。
事务的特性:
- 原子性(Atomicity):事务时不可分割的最小操作单元。
- 一致性(Consistency):事务执行前后,数据库从一个一致状态转换到另一个一致状态。
- 隔离性(Isolation):4种隔离级别(Read Uncommitted,Read Committed,Repeatable Read,Serializable)。
- 持久性(Durability):事务一旦提交/回滚,它对数据库中的数据改变是永久的。
二、Redo Log / Undo Log 引入
Redo Log保障事务的持久性。
Undo Log保障事务的原子性。
它们的作用是:确保数据库在出现崩溃、断电、宕机等故障时,能够进行恢复操作,从而保障数据一致性和完整性。
三、Redo Log(重做日志)
Redo Log 用于恢复已经提交的事务,确保事务的持久性。
当数据库发生崩溃时,Redo Log 可以帮助恢复已经提交但尚未写入磁盘的数据。
Redo Log 记录事务提交时数据页的物理修改。
由两部分组成:
1、Redo Log Buffer(重做日志缓冲)- 内存中
2、Redo Log File(重做日志文件)- 磁盘中
操作流程:多行update和delete语句先修改buffer pool中的数据(不改磁盘中数据),如果buffer pool中没有需要操作的基础数据,会从磁盘中先把数据缓存到buffer pool中,接着还是执行buffer pool中的数据,buffer pool中进行修改过的数据被称作脏页,后续一定时间后通过后台进程将脏页刷新到磁盘中,从而维护事务的一致性。
当脏页在刷新到磁盘的过程中失败了,磁盘中没有更新数据但此时事务已经提交,就需要redo log来帮忙。
Redo Log在我们对buffer pool中数据进行修改后,会先将修改后的数据记录在redo log buffer中(记录数据页的变化)。
当事务提交时,redo log会把在redo log buffer中的数据直接刷新到磁盘中,从而预防脏页刷新失败。
这种机制称为:WAL(Write-Ahead Logging)
先写日志,再写磁盘。每次事务提交时,InnoDB 会将 Redo Log 先写入磁盘,而后再慢慢将实际修改的数据写入磁盘。
同时redo log写入磁盘中时采用循环写机制:当日志写满时,会从头开始重新写。即图中ib_logfile0/1相互循环写。
四、Undo Log(回滚日志)
Undo Log 记录数据被修改前的信息,保证事务的原子性。
Redo Log 记录物理日志,Undo Log 记录逻辑日志(即执行了什么操作,而非数据内容本身)。
当进行rollback(回滚)操作时,就可以从Undo Log中调取相应记录进行回滚。
Undo Log 包含以下信息:
- 事务ID(trx ID):标识修改该行的事务
- 行的旧版本数据:在修改前的行数据
Undo Log 的版本链:
链头为最新记录,链尾为最早记录。如果事务需要回滚,MySQL 会沿着 Undo Log 链表进行逐条回滚,直到恢复到事务开始时的状态。
作用:1)事务的回滚操作 2)MVCC(多版本并发控制)
五、Undo Log 和 Redo Log的区别
六、参考文章/作者
黑马程序员 Mysql数据库从入门到精通
博客园 https://www.cnblogs.com/lgx211/p/18472544