MySQL实战之问题分析
文章目录
问题分析篇
Mysql"抖"一下 可能是flush"脏页"
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
-
“脏页"产生
- InnoDB 更新完内存写完
redo log
后, 就返回客户端成功, 本次更新成功
- InnoDB 更新完内存写完
-
引发flush"脏页"场景
- 场景一:
redo log
写满了, 系统会停止所有更新操作, 把checkpoint
往前推进,redo log
留出空间继续写。- 对应措施:InnoDB要尽量避免,因为整个系统就不能再接受更新了,所有更新会堵住。
- 场景二:系统内存不足, 需要新内存页, 内存不够用, 就要淘汰数据页, 空出内存给别的数据页使用。 如果淘汰的是“脏页”,就
flush
。- 从性能考虑,
flush
脏页一定会写磁盘。 - 内存里存在,就是正确的结果,直接返回。
- 内存里不存在,那数据文件上就是正确的结果, 读入内存后返回。
- 应对措施:InnoDB需要有控制脏页比例的机制
- 从性能考虑,
- 场景三:MySQL认为系统“空闲”时。
- 场景四:MySQL正常关闭时,把内存的脏页都flush到磁盘上,下次启动时,直接从磁盘上读数据,启动速度会更快。
- 场景一:
-
InnoDB刷脏页的控制策略
innodb_io_capacity
建议设置成磁盘的IOPS,设置不正确导致的性能问题比比皆是。- 参考因素:
- 一个是脏页比,
innodb_max_dirty_pages_pct
脏页比例上限,默认75%。不要让它经常接近75%。 - 一个是
redo log
写盘速度
- 一个是脏页比,
如何判断一个数据库是不是出问题了
误删数据后除了跑路,还能怎么办
文章作者 小叨
上次更新 2020-04-02