脏页的定义是内存中和磁盘中的不一致页。

那么脏页是如何产生的?

在之前的介绍中,我们明白了innodb引擎是如何执行更新操作的。大致是:如果数据页在内存中,直接更新内存并写redo log;否则将磁盘中的数据页载入到内存中,更新内存并写redo log。所以当发生了更新操作并且数据页在内存中时,磁盘的修改还没有发生,而仅仅是记录了redo log。这时,就会产生不一致的状态。内存中的页就被称为脏页。

脏页有什么影响?

如果内存缓存不够用了,那么根据buffer pool的lru淘汰机制,必然会淘汰老的数据页。如果被淘汰的数据页是脏页,那么必须将其刷回磁盘。

为什么要刷回?

因为后面可能又会读取该数据页上的数据,如果被修改的数据还没有被刷回磁盘,那么直接读磁盘就读不到最新的数据了,因为redo log可能没有被执行。当然,你可以说将磁盘都的数据用redo log更新一下不就行了?这样确实可以,但是这样设计就会使得整个读取流程过度复杂。mysql想要的一个状态是:在读取时,如果一个数据页在内存中,那么它的值肯定是最新的;如果不在内存中,那么从磁盘中取到的值一定是最新的。这样,整个流程理解起来更加简单清晰。

那么除了淘汰内存页,还有其他时机会刷脏页吗?

有的。其他实际:

1.redo log满了,必须先将redo log写入磁盘,写入完后,内存和磁盘就一致了;

2.系统空闲时,系统会充分利用这段时间,自动刷脏页;

3.系统关闭时;