做者:宋利兵html
来源:MySQL代码研究(mysqlcode)mysql
0、导读
本文重点介绍了InnoDB的checkpoint和Buffer Pool管理算法
04 – Checkpointsql
理论上来讲,若是MySQL数据库InnoDB存储引擎的buffer足够大,就不须要将数据自己持久化。将所有的redo log从新执行一遍就能够恢复全部的数据。可是随着时间的积累,Redo Log会变的很大很大。若是每次都从第一条记录开始恢复,恢复的过程就会很慢,从而没法被容忍。为了减小恢复的时间,就引入了Checkpoint机制。数据库
在了解checkpoint原理以前,先看两个名词:缓存
- 脏页(dirty page)
若是一个数据页在内存中修改了,可是尚未刷新到磁盘。这个数据页就称做脏页。并发
- 日志顺序号(Log Sequence Number)
LSN是日志空间中每条日志的结束点,用字节偏移量来表示。在Checkpoint和恢复时使用。异步
- Checkpoint 原理
假设在某个时间点,全部的脏页都被刷新到了磁盘上.这个时间点以前的全部Redo Log就不须要重作了。系统记录下这个时间点时redo log的结尾位置做为checkpoint. 在进行恢复时,从这个checkpoint的位置开始便可。Checkpoint点以前的日志也就再也不须要了,能够被清除掉。为了更好的利用日志空间,InnoDB并不会删除之前的Redo Log文件. InnoDB用几个Redo Log文件首尾相连,构建了一个环形缓存(circular buffer)的日志空间。函数
- 有了Checkpoint以后的Recovery性能
A. 首先要按期的将Checkpoint写入磁盘中某个地方.
B. 作Recovery时,从磁盘中读出Checkpoint.
C. 根据Checkpoint中的LSN找到Redo Log相应的位置,开始执行Redo Log.
- Sharp Checkpoint
对于繁忙的系统来讲,不多会出现这样的的一个时间点。为了能创造出这样一个时间点,最简单的办法就是:
A. 在某个时间开始中止一切更新操做
B. 全部的脏页被刷新到磁盘
C. 记录当前Redo Log的结尾位置到磁盘上.
D. Checkpoint结束,继续更新操做。