MySQL 出現 Out of memory (Needed 8164 bytes) 錯誤,意味著記憶體分配超出限制。這在 Windows 服務器環境中較為常見,通常可透過調整 MySQL 配置參數來解決。本文將詳細記錄排查過程與最終解決方案,供遭遇相同問題的開發者參考。
事件檢視器記錄如下錯誤資訊:
D:\bin\mysqld: Out of memory (Needed 8164 bytes)首先嘗試修改 query_cache_size,但問題未解決。隨後進一步增大以下參數:
query_cache_limitmax_heap_table_sizetmp_table_size調整前數值均為 16777216 (16MB),調整後均設為 67108864 (64MB)。因業務大量使用預處理語句且結果集較大,這兩個參數對臨時表與記憶體表至關重要。
在 my.cnf (Windows 下通常為 my.ini) 中新增以下配置:
[mysqld]
max_heap_table_size = 67108864
tmp_table_size = 67108864
query_cache_limit = 67108864
重啟 MySQL 服務後,透過 SHOW VARIABLES 驗證參數已生效。
MySQL 安裝目錄提供四種預設配置範本,可根據伺服器規格選擇:
| 配置文件 | 適用場景 | 建議記憶體 |
|---|---|---|
| my-small.ini | 小型資料庫、測試環境 | < 256MB |
| my-medium.ini | 中型資料庫、共用伺服器 | 256MB - 512MB |
| my-large.ini | 專用資料庫伺服器 | 512MB - 1GB |
| my-huge.ini | 企業級專用資料庫伺服器 | > 1GB |
生產環境建議以 my-large.ini 或 my-huge.ini 為基礎,再根據實際負載微調關鍵參數。
max_heap_table_size 與 tmp_table_size,兩者應保持一致,避免臨時表自動轉為磁碟表導致效能驟降。innodb_buffer_pool_size 是否過大導致系統可用記憶體不足。Commit Limit,必要時調整系統虛擬記憶體設定。透過上述調整,該錯誤已徹底解決,服務穩定運行至今。