Windows Server 2019下MySQL 8.0错误日志暴增伴InnoDB缓冲池警告咨询
基础信息
- 数据库版本:MySQL 8.0
- 部署环境:Windows Server 2019
- 错误日志路径:
C:\programdata\mysql80\data\
核心错误日志
[Warning] [MY-011959] [InnoDB] Difficult to find free blocks in the buffer pool (6091 search iterations)! 6091 failed attempts to flush a page! Consider increasing the buffer pool size. It is also possible that in your Unix version fsync is very slow, or completely frozen inside the OS kernel. Then upgrading to a newer version of your operating system may help. Look at the number of fsyncs in diagnostic info below. Pending flushes (fsync) log: 0; buffer pool: 0. 1738 OS file reads, 217 OS file writes, 45 OS fsyncs. Starting InnoDB Monitor to print further diagnostics to the standard output.
可能原因分析
- InnoDB缓冲池配置过小:错误日志直接提示找不到缓冲池空闲块,此前仅调整了
max_allowed_packet参数未同步优化缓冲池配置,大写入场景下缓冲池空间不足,脏页无法刷入磁盘就会重复打印该警告。 - 大写入业务未做拆分:业务存在超过4MB的大字段写入/大事务提交场景,这类操作会一次性占用大量缓冲池页,空闲块快速耗尽后触发持续告警。
- Windows平台刷页策略适配性差:默认刷页参数阈值过高,脏页堆积无法及时释放缓冲池空间,进一步加剧空闲块不足问题。
- 参数调整不配套:仅调大
max_allowed_packet没有同步调整相关内存参数,大报文写入时占用过多缓冲池临时空间,导致资源冲突。
修复方案
1. 扩容InnoDB缓冲池
缓冲池推荐配置为服务器可用内存的50%~70%,例如服务器内存为16G时设置为10G,32G时设置为22G。修改mysql.ini配置:
# 按实际物理内存调整数值 innodb_buffer_pool_size = 10G # 缓冲池大小超过8G时可添加该配置,提升并发性能 innodb_buffer_pool_instances = 4
2. 适配Windows平台优化刷页策略
修改mysql.ini添加以下配置,降低脏页阈值、提升刷页效率:
innodb_flush_method = unbuffered innodb_max_dirty_pages_pct = 30 innodb_max_dirty_pages_pct_lwm = 10 innodb_flush_neighbors = 0
3. 业务侧优化
如果大写入场景是常态,无需将max_allowed_packet回滚为默认值,只需将超过10MB的单写入操作拆分为多批次小事务提交,避免单事务占用过多缓冲池资源。
4. 日志与监控优化
- 停止MySQL服务后直接删除超大的旧错误日志,重启服务会自动生成新日志,快速释放磁盘空间。
- 修改
mysql.ini配置log_error_verbosity = 2,仅记录错误和核心警告,过滤非致命告警减少日志生成量。 - 长期监控缓冲池使用率,使用率长期超过90%时及时扩容缓冲池大小。
内容的提问来源于stack exchange,提问作者SupriyaD

