1.前言
数据在内存被更新后,由于wal机制,redo和binlog会先落盘,而数据脏页也会在后续喧杂额一定的时间落盘
2.落盘时机
- redo 写满
redo log 大小是固定的,写完后会循坏覆盖写入。当有新的内容要写入时,系统必须停止所有的更新操作,将checkpoint向前推进到新的位置,但是在推进之前必须将覆盖部分的所有脏页都flush到磁盘上。此时整个系统不能再更新了,TPS会降为0,所以这种情况要尽量避免。
- 内存不足需要淘汰数据页
当系统内存不足,又有新的数据页要更新,就需要淘汰一些数据页,如果淘汰的是脏页,就需要flush到磁盘(如果是干净页就直接释放出来复用)
- 系统空闲的时候后台会定期flush适量的脏页到磁盘
- Mysql正常关闭(shut down)时会把所有脏页都flush到磁盘
- 脏页比例到达设定参数
innodb_max_dirty_pages_pct默认75%,LRU内的脏块如果超过75%,强制性刷脏。
其中系统后台会有如下操作:
在loop主循环中又包含两种操作,分别是1s和10s的操作
- 每1秒:
(1) 日志缓冲刷新到磁盘,即使这个事务还没有提交
(2) 刷新脏页到磁盘
(3) 执行合并插入缓冲的操作
(4) 产生checkpoint
(5) 清除无用的table cache
(6) 如果当前没有用户活动,就可能切换到background loop。
- 每10秒:
(1) 日志换冲刷新到磁盘,即使这个事务还没有提交
(2) 刷新脏页到磁盘
(3) 执行合并插入缓冲的操作
(4) 删除无用的undo页
(5) 产生checkpoint。