大数跨境
0
0

为什么你的 MySQL 重启后总是很慢?大概率是这个参数没设对

为什么你的 MySQL 重启后总是很慢?大概率是这个参数没设对 Kubernetes技术栈
2025-10-16
2
导读:在 InnoDB 存储引擎中,innodb_buffer_pool_dump_pct 参数经常容易被大家忽视.

在 InnoDB 存储引擎中,innodb_buffer_pool_dump_pct 参数经常容易被大家忽视,但它对数据库性能优化却非常重要,尤其是在实例重启的时候。该参数控制在正常关闭 MySQL 服务时,将 InnoDB 缓冲池数据转存至磁盘的比例,合理配置该参数,不仅能大幅缩短数据库服务重启后的预热时间,还能确保高频访问的数据在服务恢复时立即可用,为业务连续性提供有力保障。

InnoDB Buffer Pool 的重要性

在深入了解 innodb_buffer_pool_dump_pct 的具体机制之前,有必要再回顾一下 InnoDB 缓冲池的核心作用。作为 InnoDB 引擎的关键内存区域,BP 专门用于缓存数据页和索引页。当查询请求需要检索数据时,MySQL 会优先在 BP 中查找,若目标数据页已存在于 BP 中,便可直接从内存中读取,速度相比磁盘读取有数量级提升。若未找到,则需要从磁盘加载数据到缓冲池,这个过程可能会置换出(LRU)使用频次较低的数据页。

缓冲池的大小由 innodb_buffer_pool_size 参数控制。通常建议将该值设置为服务器可用内存较大的比例,比如 70%,充足的缓冲池能有效减少磁盘 I/O,从而提升查询性能。在 MySQL 正常关闭时,InnoDB 会先去刷脏页,随后清空缓冲池。

数据库重启后,缓冲池最初处于空状态,需要在查询执行过程中逐步加载数据页。在此“预热”阶段,由于大部分请求无法命中内存缓存,MySQL 需要频繁从磁盘读取数据,整体性能通常会明显低于正常运行时的水平。

innodb_buffer_pool_dump_pct 参数的作用

在 MySQL 中,innodb_buffer_pool_dump_pct 用于控制数据库关闭前,缓冲池(Buffer Pool)中有多少比例的 page 会被保存到磁盘。具体来说,该参数定义了最近最常使用(MRU)的页面中,应被写入转储文件的百分比。这些页面被视为最"热"、访问最频繁的数据,也因此是重启时最值得优先加载的对象,提高实例在启动初期的性能。

参数取值范围是 0 到 100:

  • 0 表示完全禁用 dump,不会导出任何页
  • 100 表示尽可能导出整个缓冲池的内容

这些数据会被保存到 $DATADIR/ib_buffer_pool 文件中。
要让缓冲池的 dump 和 load 机制生效,还需要同时开启以下两个参数:(默认已开启)

# cat my.cnf
# 在数据库关闭时执行缓冲池导出;
innodb_buffer_pool_dump_at_shutdown = ON 
# 在数据库启动时加载之前导出的页信息
innodb_buffer_pool_load_at_startup = ON 

如果这两个参数未启用,即便配置了 innodb_buffer_pool_dump_pct,也不会有任何效果。

innodb_buffer_pool_dump_pct 设置多少合适 ?

innodb_buffer_pool_dump_pct 的默认值是 25,据我了解这个参数很少有人调整,绝大部分同学使用默认值。但我想说的是 25 不适用所有情况,有一些优化空间。

innodb_buffer_pool_dump_pct 的最优取值取决于多个因素,包括:

  • Buffer Pool 的大小;
  • 业务负载的特性:是高并发 OLTP 还是 OLAP 业务;
  • DB 服务器磁盘 I/O 能力;
  • 数据库实例重启的时间要求;

当参数值设置较高时,意味着会导出更多页,从而生成更大的 dump 文件,并延长数据库的关闭时间。 但与此同时,在数据库重启后能预加载更多的热数据页,使系统能够更快恢复到正常性能水平。

相反,较低的取值会存储更小的 dump 文件、更快的关闭速度,但预加载的数据页较少,系统在重启后的性能恢复到正常水平的时间可能变长。

然而实际业务中,BP 的大小是需要考虑的,BP 越大 dump 的数据页就越多,关闭的时间就越久。一个真相是 dump 文件 $DATADIR/ib_buffer_pool 中保存的并非数据页本身,而是 space id 和 page id,除非你的 BP 非常大,比如 >=256 GB,  否则在 ssd nvme 配置的情况下(都 2025 年了,生产环境应该没有不是 ssd 的 DB 服务器了),请大胆把 innodb_buffer_pool_dump_pct 设置成 80,dump 和 load ib_buffer_pool 文件对你启动和关闭实例时间的影响很小!!!

# dump 文件的内容:space id,page no
cat ib_buffer_pool | head -n 10
42179,174570
7090,81921
7090,81920
7090,2
7090,0
42144,214640
....

对于专用的分析库、离线报表场景,偏向于每次加载不同数据,BP 预热的意义并不大,所以这种情况是建议设置为较低的值,0~ 25% 是合理的。

也就是说,除了做分析、离线报表的实例,可以使用默认值,绝大多数场景,都应该大胆的将 innodb_buffer_pool_dump_pct 设置为 50~100% 之间,在最大化预热效果和最小化启动时间之间取得平衡,从而提升 MySQL 数据库的性能!

总结:

  1. innodb_buffer_pool_dump_pct 转储的是 page id,并非完整的 page 数据,ssd nvme 时代,实例重启时,大多数情况下dump 和 load 的时间可以忽略不计。

  2. 除非你的 BP 设置的非常大,>=256GB 或者是 分析报表的场景,innodb_buffer_pool_dump_pct 都应该设置为一个较大的值(推荐 50% ~ 100%),以提升性能。

  3. 默认值 25,是平衡了各种情况,并非最优解,根据实际情况调整,避免“冷启动”时的性能下降。

Reference
[1] https://dev.mysql.com/doc/refman/8.4/en/innodb-preload-buffer-pool.html
[2] https://dev.mysql.com/doc/refman/8.4/en/innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct

[3]https://medium.com/@stephenhodgkiss1/understanding-innodb-buffer-pool-dump-pct-for-optimal-mysql-performance-b5dd03370665
[4]https://developer.aliyun.com/article/1230109  

[5]https://blog.csdn.net/weixin_41455464/article/details/151051115

【声明】内容源于网络
0
0
Kubernetes技术栈
聚焦云原生技术生态建设,涵盖DBA、SRE、DevOps、大数据、AI等领域的实践案例与前沿技术分享,欢迎关注交流。
内容 337
粉丝 0
Kubernetes技术栈 聚焦云原生技术生态建设,涵盖DBA、SRE、DevOps、大数据、AI等领域的实践案例与前沿技术分享,欢迎关注交流。
总阅读243
粉丝0
内容337