本教程操作环境:windows7系统、mysql8版本、Dell G3电脑。
脏页(内存页)
干净页:内存和磁盘中的数据一致 脏页:内存和磁盘中的数据不一致为什么会出现 脏页
平时很快的更新操作,都是在写内存和日志。 他并
不会马上同步到磁盘数据页,这时内存数据页跟磁盘数据页内容不一致,我们称之为
脏页。
这里面就涉及 mysql 的内存管理机制
内存管理机制简述
缓冲区中包含这三大类列表。分别为:
LRUList、
FreeList、
FlushList。
在数据库刚启动时,LRUlist中
没有数据页。FreeList存放空闲页。 当需要读取某个页时,会从FreeList中获取一个空闲页,读入数据后,放入LRUlist中 如果FreeList中没有空闲页了,那么根据LRU算法淘汰Lru列表中末位的页 当LRUlist中的页被修改后,页就变成了脏页,这个页也会被加入FlushList中
总结:LRUList(管理已经被读取的页)和FreeList(管理空闲的页)用来管理页的可用性;FlushList(管理脏页)用来管理脏页的刷新
在脏页数据同步到磁盘过程中,如果对该磁盘数据页执行 SQL 语句。执行速度就会变慢
数据修改和读取只依赖缓冲区行不行
如果数据修改和读取只依赖内存的缓冲区,那么一旦数据库宕机,内存中的数据都会丢失。所以MySQL使用之前讲过的redo log来实现异常重启的数据恢复。
简单来说,就是在更新缓冲区之前,先写入redo log,保证异常重启之后可以正常恢复缓冲区中的数据。
为什么脏页一定要刷新
上面说了 数据只放在缓冲区,会出现数据库宕机,内存数据丢失。所以需要刷新到磁盘。 redo log如果无限大或者有许多个文件的话,系统中有大量的修改操作,一旦宕机,恢复的时间也会非常长。
所以自然而然,我们就一定需要把内存中的脏页按照某种规则刷新到磁盘中,有了刷新这个操作,缓冲区的大小问题和redo log的大小问题都可以解决。
缓冲区不需要无限大了,因为可以持久化到磁盘 redo log也不需要无限大了,因为一旦持久化到磁盘,redo log中对应的那部分数据就可以释放。刷脏页有下面4种场景
当
redo log 写满,mysql就会
暂停所有更新操作,将同步这部分日志对应的
脏页同步到磁盘。
系统
内存不足时,需要
淘汰一部分数据页,如果淘汰的是
脏页,就要
先将脏页同步到磁盘。
MySQL 认为系统
空闲的时候,有机会就
同步内存数据到磁盘,这种没有性能问题。
MySQL 正常关闭,MySQL 会把
内存的脏页都同步到磁盘上,这样下次 MySQL 启动的时候,就可以直接从磁盘上读数据,启动速度会很快。这种没有性能问题。
会造成的影响
如果是 redo log 写满了
要尽量避免
redo log 写满。否则整个系统的更新都会停止。
此时写的性能变为 0,必须等待该日志对应
脏页同步完成后才能更新,这时就会导致 sql 语句 执行的很慢。
【相关推荐:mysql视频教程】
