MySQL脏页刷盘流程
1. 什么是脏页
- InnoDB更新语句,是先查询到指定记录到内存缓冲区,然后更新内存缓冲区数据,再写redo log。并不会立即将数据页刷新到磁盘上。这样就会导致内存数据页和磁盘数据页的数据不一致的情况。这种数据不一致的数据页成为脏页。当脏页写入到磁盘后(flush),数据一致性后称为干净页
2. 关于Innodb刷盘的策略
- 对于数据更新操作,存储引擎会将数据页先加载到内存缓冲池,然后修改内存中该数据页的内容。这样就会产生脏页,脏页需要刷新到磁盘才能保证对数据表的更新被持久化。
- 但是如果更新一条记录就需要将一个页刷盘一次,则这个开销就有点太大。太多次IO操作非常影响性能。
- 所以存储引擎对于内存数据页的修改,不是一有修改就会刷盘,而是达到一定的阈值才会去刷盘。那么就会产生一个问题,如果此时数据库宕机了,则内存的的脏数据页会没有完成刷盘就丢失了。这样就会导致有些更新被丢失了。
- 因此InnoDB存储引擎引入了redo日志,在数据库对内存数据页的更新后会先将更新日志写入redo日志的内存缓冲区中,当redo日志的内存缓冲区中的日志写入redo日志的磁盘文件上,就表示这个操作完成了持久化。然后存储引擎在合适的时间再将数据脏页刷回磁盘。
- 可能你会问,redo日志的内存缓冲区中的日志写入redo日志的磁盘文件上,也是需要IO啊,为什么不直接将数据页写入磁盘呢?
- 因为redo日志写入磁盘文件这个过程时顺序存储的(在磁盘文件的尾部追加即可)。而IO刷盘是随机存储的(需要寻找刷新的磁盘位置)。所以redo日志写入磁盘的速度远远快于数据的刷盘。
3. 什么时候会flush脏页
- 磁盘上的redo log日志文件写满时:redo log大小固定,写完后会循环覆盖写入,写满后当有新内容要写入时,系统必须停止所有的更新操作,将checkpoint向前推进到新的位置,但是在推进之前必须将覆盖部分的所有脏页都flush到磁盘上
- 内存不足需要淘汰数据页。如果淘汰的是脏页,则需要将这些脏页刷盘。
- 系统空闲的时候后台会定期flush适量的脏页到磁盘。
- MySQL正常关闭时,会把所有脏页都flush到磁盘。
4. flush对系统性能的影响
- 前两种会造成系统新能问题。第三种系统空闲所有不会有性能问题。第四种要关闭自然也不用考虑性能问题。
MySQL脏页刷盘流程相关推荐
- Mysql - 脏页刷新机制
什么是脏页? Mysql InnoDB表基本都是基于B+树索引进行存储的,而数据存储的最小单元就是数据页(物理存储结构:表 -> 表空间(和索引)-> 段 -> 区 -> 页 ...
- RocketMQ刷盘流程
前言 这里推荐两个看源码较好用的快捷键,可以提高源码阅读效率(win10系统): 1. ctrl + alt + h:查看方法的调用链 2. ctrl + h:查看类的继承关系和接口实现关系 简介 消 ...
- 刷脏页策略linux,【随笔】Linux刷脏页
一.脏页的由来 前情摘要: 1. 在多级存储系统中,上一级高速设备会成为下一级低速设备的缓存.相较之内存,磁盘是一个低速设备,因此Linux中会通过一种叫"磁盘高速缓存"的软件机制 ...
- MySQL索引页结构
1. 前言 「页」是InnoDB管理存储空间的基本单位,也是内存和磁盘交互的基本单位.也就是说,哪怕你需要1字节的数据,InnoDB也会读取整个页的数据,下次读取的数据如果恰巧也在这个页里,就能命中缓 ...
- mysql刷脏页的原理_Mysql脏页flush及收缩表空间原理解析
mysql脏页 由于WAL机制,InnoDB在更新语句的时候,制作了写日志这一个磁盘操作,就是redo log,在内存写完redo log后,就返回给客户端, 即更新成功. 把内存里的数据写入磁盘的过 ...
- 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“
本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...
- MySQL数据和日志的刷盘机制以及双一配置
详细介绍了MySQL数据和日志的刷盘机制以及双一配置,双一配置可以保证Mysql日志数据不丢失. 文章目录 1 内存数据的刷盘机制 2 MySQL数据的刷盘 2.1 刷盘数据来源 2.2 脏页以及刷盘 ...
- gridview databind 会导致页面刷新马_Innodb批量页面刷盘情况下的quot;两次写quot;
//Innodb批量页面刷盘情况下的"两次写"// 之前的文章中,我们介绍过innodb的两次写特性,这里给出链接: InnoDB的两次写特性 今天我们完善一下这部分的内容. 我们 ...
- Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染
一.应该给Redis分配多少内存空间 八二原则:80%的请求都是访问数据库中同样的20%的数据(热点数据只占20%),所以一般给Redis分配15% - 30%数据总量的内存空间(只保存热点数据,冷数 ...
最新文章
- Windows下创建进程简介
- vue里获取不到data_vue methods中取不到data值
- Ubuntu下安装realtek的rtl8188eu网卡芯片驱动
- 华为面试题之大整数相加
- TabHost选项卡的 功能和用法
- 动态连接库的两种方式
- 关于 sql语句的一些小优化
- SSD磁盘测试不达标排查
- mongodb 系列 ~ mongo的两种引擎对比
- rsync同步目录及同步文件
- 御剑端口扫描工具2020下载
- Servlet 身份验证体系结构
- AlphaFold2: Highly accurate protein structure prediction with AlphaFold笔记
- matlab的死区环节,基于SIMULINK对非线性系统死区环节进行仿真
- vue element-ui 日期弹出框右侧被遮挡
- 北理计算机实验18,18北理应用统计经验贴
- 关于抽象类的实验(java 内部类、多态等练习)
- FFmpeg--一个操作视频音频的强大工具
- Spring容器 SpringMVC容器 web容器的关系
- 在 Flutter 中使用 TensorFlow Lite 插件实现文字分类