故障現象
Windows Server 2003 x86 + MySQL 5.1.30,mysqld.exe 句柄數飆升至 30 萬+,Event 類型佔 301,663,導致其他應用無法申請句柄而崩潰。
環境與配置
- OS: Win 2003 Server (x86),用戶模式地址空間 2GB 限制,句柄表極易耗盡。
- MySQL:
query_cache_size=84M、innodb_buffer_pool_size=250M、innodb_thread_concurrency=18。
排查思路與嘗試方案
| 方向 | 操作 | 預期效果 |
| 關閉 Query Cache | query_cache_size=0、query_cache_type=OFF | 減少內部同步事件對象創建 |
| 關閉 innodb_thread_concurrency | innodb_thread_concurrency=0(無限制) | 避免並發控制信號量/事件積聚 |
| 遷移 64 位系統 | Win x64 或 Linux x64 | 根治 2GB 虛擬地址空間與句柄表上限瓶頸 |
官方 Bug 線索
Bug #45252:Windows 下 Query Cache 與高併發導致 Event 句柄洩漏,5.1/5.5 早期版本存在,5.6+ 已修復相關邏輯。
最佳實踐建議
- 生產環境強制 64 位 OS + 64 位 MySQL,徹底解決地址空間與句柄上限。
- 升級至 MySQL 5.7/8.0,內部同步機制重寫,大幅減少內核對象創建。
- 若必須留在 32 位 Windows:關閉 Query Cache、設
innodb_thread_concurrency=0、監控句柄數告警(handle.exe -p mysqld.exe)。
- 上一篇文章: 遠程連接 MySQL 報「Communications link failure」排查實戰
- 下一篇文章: MySQL 審計方案:init-connect + Binlog 實現操作追蹤與責任歸屬
Copyright ©
程式碼之家 All Rights Reserved