mysql数据落盘详解_MySQL的Flush-List和脏页的落盘机制⼀、回顾
MySQL启动后Buffer Pool会初始化。Buffer Pool也会初始化好N多个空⽩的缓存页,以及它们的描述数据会被组织成LRU链表以及FreeList 双向链表。
这时你从磁盘中读取⼀个数据页,会先从Free List中出⼀个空闲缓存页的描述信息,然后将你读出的数据页中加载进缓存页中。同时将缓存页的描述信息从Free List中剔除,此外该描述信息块还会被维护进LRU链表中。
数据页被加载进Buffer Pool后你就可以对其进⾏变更操作了。
⼆、Flush List
为了加快响应客户端的速度,MySQL会在Buffer Pool中对数据进⾏修改,可是⼀旦你对LRU链表中的缓存页做了修改,那该页中的数据和磁盘中的数据页信息就不⼀致了!⼤家⼀般管这种数据页叫做脏页。
为了保证数据的最终⼀致性,MySQL是需要将脏页刷新回磁盘的!
但是问题是:需要将哪些数据页刷新回磁盘呢?
这就引出了Flush List~
Flush List 和 Free List很像,都是由Buffer Pool中数据描述信息组织⽽成的双向链表。
⼀旦你对内存中的缓冲页作出了修改,那该缓冲页对应的描述信息块就会添加进 Flush List。这样当Buffer Pool中的数据页不够⽤时,我们就可以优先将 Flush List中的脏数据页刷新进磁盘中。
如果你读了前⼏篇⽂章那你肯定知道了 LRUList、FreeList、FlushList、Buffer Pool、脏页、脏数据。
下⾯乘胜追击!⼀起看⼀下脏页的落盘机制
三、什么是脏页?什么是脏数据?
什么是脏页?
我在介绍Flush List 的那篇⽂章有提及,脏页就是LRU链表中被修改了的缓存页。他们和磁盘中的数据页不⼀致,脏页是需要被刷新回磁盘的。
什么是脏数据?
这个问题其实引出了脏读的概念。举个例⼦:事物A中读取到了事物B中未提交的数据,我们管这些数据叫做脏数据。
四、脏页刷回磁盘的时机
当Buffer Pool不够⽤时,根据LRU机制,MySQL会将Old SubList部分的缓存页移出LRU链表。如果被移除出去的缓存页的描述信息在Flush List中,MySQL就得将其刷新回磁盘。
InnoDB存储引擎将脏页刷回磁盘的时机有蛮多的,你可以把它当作拓展知识⼤概浏览⼀下。
1、当MySQL数据库关闭时,会将所有的脏数据页刷新回磁盘。这个功能由参数:innodb_fast_shutdown=0控制,默认让InnoDB在关闭前将脏页刷回磁盘,以及清理掉undo log。
2、有⼀个后台线程Master Thread会按照每秒或者每⼗秒的速度,异步的将Buffer Pool中⼀定⽐例的页⾯刷新回磁盘中。
3、在MySQL5.7中,Buffer Pool的刷新由page cleaner threads完成。
我们可以通过innodb_page_cleaners参数控制page cleaner threads线程的数量,但是当你将这个数值调整的⽐Buffer Pool的数量还⼤时,MySQL会⾃动将 innodb_page_cleaners数量设置为innodb_buffer_pool_instances的数量。
Innodb1.1.x之前需要保证LRU列表中有⾄少100个空闲页可以使⽤。低于这个阈值就会触发脏页的刷新。
从MySQL5.6,也就是innodb1.2.X开始,innodb_lru_scan_depth参数为每个缓冲池实例指定page cleaner threads 扫描Buffer Pool 来查要刷新的脏页的下⾏距离。默认为1024,该后台线程每秒都会执⾏⼀次。
4、当脏数据页太多时,也会触发将脏数据页刷新回磁盘。该机制可由参数innodb_nax_dirty_pages_pct控制,⽐如将其设置为75,表⽰,当Buffer Pool中的脏数据页达到整体缓存的75%时,触发刷新的动作。现实情况是该参数默认值为0。以此来禁⽤Buffer Pool早期的刷新⾏为。
5、当redo log不可⽤时,也会强制脏页列表中的脏页刷新回磁盘。这个机制同样由⼀个后台线程完成。
五、其他关于脏页刷新的知识点
刷新临接数据页:意思是当MySQL将某脏页刷新回磁盘时,是否也以相同的态度将该脏页邻接的脏页⼀并刷新回磁盘。
可以通过参数innodb_flush_neighbors控制该过程。
设置为0时表⽰,禁⽤刷新邻接的功能。
设置为1时表⽰,以相同的态度刷新其邻接的脏页。
设置为2时表⽰,以相同的程度刷新脏页。
那如何选择将其设置为哪种状态呢?
mysql下载哪个盘你可以根据MySQL实例所在机器的存储类型来决定。如果为HDD存储建议将其开启,因为HDD的磁盘刷新速率较低,开启该参数后可以有效的减少IO操作。相反如果使⽤SSD存储,其本⾝就有⾼磁盘IO的特性,建议禁⽤该参数。
以上就是MySQL的Flush-List和脏页的落盘机制的详细内容,更多关于MySQL Flush-List和脏页的落盘机制的资料请关注云海天教程其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论