在innodb体系结构中说到了缓冲池里使用了checkpoint技术。
缓冲池的设计就是为了协调cpu的速度和磁盘的速度,所以页的操作首先都是在缓冲池中完成的,例如读取数据,先是从磁盘读取到缓冲池里。那么当修改和删除语句改变了缓冲池里的页中的记录的时候,这个页就是脏页,(缓冲池里的页里的数据比磁盘里的数据新),那么此时数据库需要将新版本的页从缓冲池刷新到磁盘。
假如每次一个页的变化就将新的页的版本刷新到磁盘,多个页里的数据都发生了变化,如果都去刷盘的话,开销是非常大的,db的性能也变的非常差。而且,如果刷盘的时候宕机了,数据就不能恢复了。
为了避免数据刷盘时宕机带来的数据丢失问题,当前事务数据库系统普遍采用了一种策略,名叫 Write Ahead log策略,即当事务提交时,先写重做日志,再修改页。当由于发生宕机而导致数据丢失时,通过重做日志 redo log来完成数据的恢复,这也是事务ACID中的D持久性的要求。
假如redo log和 缓冲池足够大,能够缓冲所有数据,那么是不需要将缓冲池里页的新数据刷新到磁盘中的,因为宕机后,可以通过redo log恢复到宕机发生的时刻。很显然缓冲池不可能装的下数据库的所有数据,而redo log也不可能无限大,如果无限大,那么宕机后恢复的时候,运行了几个月几年的数据库,恢复会非常久,代价非常大。
当数据库发生宕机是,数据库不需要重做所有的日志,因为CheckPoint之前的页已经刷新回磁盘了,所以数据库只需要对CheckPoint后的redo log进行恢复,这样就缩短了恢复时间。
在innodb中,CheckPoint发生的时间,条件,脏页的选择都非常复杂。其实CheckPoint无非就是刷新缓冲区中页里的新数据到磁盘里,关键就是每次刷新多少页到磁盘,每次从哪里取脏页,以及什么时间触发CheckPoint,在innodb中有两种CheckPoint,分别为:
Sharp CheckPoint 一般不用
Fuzzy CheckPoint 默认使用
在innodb中可能发生如下几种情况的Fuzzy CheckPoint
1、对于Master Thread中发生的CheckPoint,差不多是以每秒或者每10s的速度从缓冲池的脏页列表中刷新一定比例的页回磁盘,这个过程是异步的,不阻塞其他线程
2、flush lru list CheckPoint,innodb存储引擎需要保证LRU列表中有差不多100个空闲页可以使用,在innodb1.1.x版本之前,需要检查LRU列表中是否有足够的可用空间操作发生在用户查询线程中,显然这会阻塞用户的查询操作。倘若没有100个可用空闲页,那么innodb存储引擎会将LRU列表尾端的页移除。如果这些页有脏页,则需要CheckPoint,而这些页是来自LRU列表的,所以称为FLUSH_LRU_LIST CheckPoint。
3、redolog不可用的时候需要将一些页刷新回磁盘,而此时脏页是从脏页列表中选取的,
4、脏页太多的时候触发CheckPoint
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!