Mysql Innodb日志(redo,undo)详解

概述
大家都知道mysql是日志优先的数据库,日志先于数据写入磁盘,先使用顺序IO写入然后,再根据一定的频率将脏页刷新回磁盘。实现了数据库崩溃后的数据恢复等。本文主要是介绍 redo log(重做日志) 和 undo log(回滚日志),他们的作用,实现原理,以及 联系与区别。

什么是redo log?
redo log (重做日志),是在修改数据缓冲页时候记录页修改的日志,是一种基于页的物理日志。记录包括 数据页,undo页,也就是说undo日志也会记录在redo log中。在事务提交的时候,会先刷新redo log写入磁盘。redo log是相对顺序IO(并不完全是顺序的,日志文件头部记录了整个日志文件size,每次写入都要维护这个值)。在数据库崩溃后会重做日志中 CheckPoint(已经成功写入LSN)开始的事务。
什么是undo log?
undo log (回滚日志),在事务进行回滚的时候将数据恢复原始数据。在MVCC中提供多版本控制,所以MCCV不会有任何的额外数据开销。回滚日志是逻辑日志,记录了更新或者删除操作与更新前后数据等,通过逆操作进行回滚,比如更新一个数据,回滚就是更新回原来的值,删除了就是要插入回来。
MVCC
MVCC(Multi Version Concurrency Control),多版本并发控制,指通过存储引擎通过多版本控制的方式来读取当前执行数据中的行数据。如果读取的行正在执行Delete或者Update操作,这时读取不会因此去等待行上的锁释放。相反的会去读取行的一个快照数据(undo日志提供)。
在 READ COMMITTED 和 REPEATABLE READ 两种事务隔离级别下都使用的MCCV,但是在两种隔离级别中对于快照数据定义不同。在READ COMMITTED 中总是读取被锁定行最新一份快照数据。而REPEATABLE READ总是读取事务开始时的行数据版本。

Mysql 日志写入流程
Mysql Innodb日志(redo,undo)详解_第1张图片

  1. 首先事务开始。
  2. 查找缓冲池中是否有数据页,如果没有就去查找然后缓冲到缓冲池。
  3. 对数据经行修改,修改同时,undo日志记录更改记录,redo日志记录页变化情况。
  4. 提交commit。
  5. redo日志刷新到磁盘,写double write 刷新到磁盘。
  6. 事务提交成功。
  7. 写入二进制日志。

Mysql 恢复流程

  1. 读取double write 文件,恢复磁盘文件(数据页和undo页)到初始状态。
  2. 读取redo log 日志文件,获取最后一次的checkPoint 的 LSN
  3. 重做 check point 开始到结尾的redo log
  4. 根据BinaryLog(判断事务是否完成)与undoLog 回滚尚未完成的事务

你可能感兴趣的:(Mysql)