首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 5.6 低內存環境崩潰自愈實戰:Swap 空間擴容拯救 InnoDB Buffer Pool

     編輯:MySQL 綜合教學

MySQL 5.6 低內存環境崩潰自愈實戰:Swap 空間擴容拯救 InnoDB Buffer Pool

故障現場

  • 雲主機:1 核 1 GB 內存、20 GB 磁盤、CentOS 7、LAMP + WordPress。
  • 現象:運行一段時間後 MySQL 自動停止,ps -aux | grep mysql 無進程。
  • 錯誤日誌:
InnoDB: mmap(137363456 bytes) failed; errno 12
InnoDB: Cannot allocate memory for the buffer pool
Plugin 'InnoDB' init function returned error
Unknown/unsupported storage engine: InnoDB
Aborting

排查過程

  1. free -m 顯示物理內存 991 MB,可用 461 MB,Swap 為 0。
  2. 2. 嘗試調小 innodb_buffer_pool_size(默認 128 MB)仍無法啟動。 3. 懷疑:無 Swap 導致內存分配失敗時無緩衝,直接 OOM Kill 或分配失敗。

解決方案:創建 2 GB Swap 文件

# 1. 創建 2GB 空文件
dd if=/dev/zero of=/udata/men.swap bs=1k count=2048000

# 2. 格式化為 Swap
mkswap /udata/men.swap

# 3. 掛載啟用
swapon /udata/men.swap

# 4. 寫入 /etc/fstab 永久生效
echo '/udata/men.swap swap swap defaults 0 0' >> /etc/fstab
# 或使用 UUID(blkid 獲取)
# UUID=xxxx swap swap defaults 0 0

驗證與效果

free -m
#              total  used  free shared buff/cache available
# Mem:          991   857   73     0      60         41
# Swap:        1999    67  1329

service mysqld start
# Starting MySQL.... SUCCESS!

深度解析:為什麼 Swap 能救場?

  • Linux 內存分配策略:malloc 申請大塊內存(如 Buffer Pool 128 MB)時,若物理內存不足但有 Swap,內核會將非活躍頁換出到 Swap,騰出物理頁滿足分配;無 Swap 則直接返回 ENOMEM (errno 12)。
  • MySQL 5.6 默認 innodb_buffer_pool_size=128M,1 GB 內存機器扣除 OS、Apache、PHP 後可用不足 128 MB,分配失敗。
  • Swap 不會讓 MySQL 運行在 Swap 上(性能極差),而是作為內存分配的安全網,允許啟動階段大塊連續內存申請成功。

後續優化建議

  1. 適當調小 innodb_buffer_pool_size:如 64-96 MB,留足 OS 內存。
  2. 關閉不必要的插件/功能:performance_schema=OFF、query_cache_size=0。
  3. 升級實例規格:1 GB 內存運行 LAMP + WordPress 屬極限配置,建議 ≥ 2 GB。
  4. 監控告警:監控 Swap used > 10% 觸發擴容或優化。

參考國外同款案例:Solved: MySQL Crash - Cannot allocate memory for the buffer pool

一個 Swap 文件,讓 1 GB 內存也能穩穩跑起 MySQL 5.6。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved