问题分析篇

Mysql"抖"一下 可能是flush"脏页"

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。

  • “脏页"产生

    • InnoDB 更新完内存写完 redo log 后, 就返回客户端成功, 本次更新成功
  • 引发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 写盘速度

如何判断一个数据库是不是出问题了

误删数据后除了跑路,还能怎么办