当前位置: 首页 > news >正文

在 MySQL 的 InnoDB 存储引擎中,脏页(Dirty Page)的刷盘(Flush)时机

1. 后台线程周期性刷盘

  • 触发机制:

    InnoDB 的 Page Cleaner 线程 会周期性地将脏页刷入磁盘,防止内存中脏页堆积。

  • 触发条件:

    • 脏页比例阈值:当 Buffer Pool 中脏页占比超过 innodb_max_dirty_pages_pct(默认 90%)时,触发异步刷盘。

    • 空闲时主动刷盘:系统空闲时,后台线程主动刷盘以减少突发 I/O 压力。

  • 相关参数:

    • innodb_io_capacity:定义每秒可执行的 I/O 操作次数(影响刷盘速度)。

    • innodb_max_dirty_pages_pct_lwm:低水位线阈值(默认 10%),脏页比例低于此值时减少刷盘频率。

2. Redo Log 空间循环利用

  • 触发机制:

    InnoDB 的 Redo Log 文件是循环写入的,当 Redo Log 空间即将耗尽时,必须推进 Checkpoint LSN,强制刷盘对应的脏页以释放可重用空间。

  • 触发条件:

    • Redo Log 剩余空间不足,无法写入新日志。

  • 相关参数:

    • innodb_log_files_in_group 和 innodb_log_file_size:控制 Redo Log 文件数量和大小。

3. Buffer Pool 空间不足

  • 触发机制:

    当 Buffer Pool 需要加载新页但空闲页不足时,会触发 LRU(最近最少使用)淘汰机制。如果淘汰的页是脏页,需先刷盘。

  • 场景示例:

    • 执行大查询时,需加载大量新页到 Buffer Pool,触发脏页刷盘。

4. 事务提交时的隐式刷盘

  • 触发机制:

    事务提交时,若开启 innodb_flush_log_at_trx_commit=1,Redo Log 会强制刷盘,但脏页可能仍留在 Buffer Pool 中异步刷盘。

  • 例外情况:

    • 若使用非持久性设置(如 innodb_flush_log_at_trx_commit=0/2),Redo Log 可能延迟刷盘,脏页刷盘仍由后台线程控制。

5. 数据库关闭或重启

  • 触发机制:

    MySQL 正常关闭时,会强制将所有脏页刷盘,确保数据持久化。

  • 异常关闭恢复:

    若崩溃或异常关闭,重启时通过 Redo Log 重放未刷盘的脏页修改。

6. 手动触发刷盘

  • 命令操作:

    • FLUSH TABLES ... FOR EXPORT:强制刷盘指定表的脏页。

    • SET GLOBAL innodb_max_dirty_pages_pct=0:临时将脏页比例阈值设为 0,触发立即刷盘。


脏页刷盘流程

以事务 UPDATE t SET c1=10 WHERE id=1 为例:

  1. 修改数据页:

    • Buffer Pool 中的页被修改为 c1=10,标记为脏页。

  2. Redo Log 记录:

    • 生成 Redo Log 条目(物理修改),提交时根据配置刷盘。

  3. 异步刷盘触发:

    • 后台线程将脏页副本写入双写缓冲区(Double Write Buffer),再写入数据文件。

  4. 更新 Checkpoint LSN:

    • 脏页刷盘完成后,推进 Checkpoint LSN,释放 Redo Log 空间。

总结

触发场景

核心逻辑

性能影响

后台线程周期性刷盘

控制脏页比例,避免内存堆积

平滑 I/O,减少高峰压力

Redo Log 空间不足

强制刷盘以推进 Checkpoint,释放日志空间

可能引起短暂 I/O 高峰

Buffer Pool 空间不足

淘汰脏页前先刷盘,确保数据持久化

影响查询响应时间

事务提交与关闭

保证持久性,强制或异步刷盘

提交延迟或关闭时间延长

优化建议:

  • 根据负载调整 innodb_io_capacity 和 innodb_max_dirty_pages_pct,平衡刷盘速度和内存使用。

  • 监控 Innodb_buffer_pool_pages_dirty 状态,避免脏页堆积影响性能。

  • 全 SSD 环境可关闭双写缓冲区(innodb_doublewrite=OFF),提升刷盘效率。

相关文章:

  • Deepseek开源周第一天:FlashMLA来袭
  • 从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯
  • CentOS 9/10 Stream / RockyLinux 8 上安装 Oracle database 19c
  • C++ day5 练习
  • QT:paintEvent、QPainter、QPaintDevice
  • Matlab——图像保存导出成好看的.pdf格式文件
  • 存储引擎、索引(MySQL笔记第四期)
  • 指令模型VS推理模型
  • 复现win7永恒之蓝漏洞
  • angular日历
  • 常用视频格式及其编码方式对比
  • CORS:跨域访问、如何在Nginx中配置允许跨域访问
  • UE的TreeView组件使用
  • 2025-2-24-4.9 单调栈与单调队列(基础题)
  • 计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型民宿推荐系统 hive民宿可视化 民宿爬虫 大数据毕业设计(源码+文档+PPT+讲解)
  • steam_api.dll丢失3分钟修复指南,解决Steam游戏无法运行
  • STM32 HAL库0.96寸OLED显示液晶屏
  • 图解感知机(Perceptron)
  • Linux与自动化的基础
  • 2025年02月24日Github流行趋势
  • 去年中企海外新增风电装机量5.4GW,亚太区域占比过半
  • 释新闻|拜登确诊恶性前列腺癌,预后情况如何?
  • 减负举措如何助力基层干部轻装上阵?记者一线调查
  • AI创业者聊大模型应用趋势:可用性和用户需求是关键
  • 英国警方再逮捕一名涉嫌参与首相住宅纵火案嫌疑人
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二