Lost connection to MySQL server at 'reading initial communication packet'
system error: 0
innodb_buffer_pool_size` 設定過大超過實體記憶體現象:配置檔設定 innodb_buffer_pool_size = 2048M,但伺服器實體記憶體僅 4G(或容器限制 2G),導致啟動時無法分配共享記憶體,MySQL 異常退出,客戶端收到「初始通訊封包讀取失敗」。
innodb_buffer_pool_size ≈ 物理記憶體 × 60~75%≈ 可用記憶體 × 50~60%1G~1.5G(1024M~1536M)10G~12G# /etc/my.cnf
[mysqld]
innodb_buffer_pool_size = 1024M
# 或依實際記憶體調整
innodb_buffer_pool_size = 12G
修改後 systemctl restart mysqld。
MySQL 預設對連入連線執行「反向 DNS 解析」(IP → 主機名),若 DNS 伺服器無回應或極慢,握手階段逾時,客戶端收到同樣錯誤。
mysql -e "SET GLOBAL skip_name_resolve=ON;"
# /etc/my.cnf
[mysqld]
skip-name-resolve
副作用: 啟用後,mysql.user 授權表 Host 欄不再支援主機名,僅能用 IP、CIDR、%、localhost。請先確認所有帳號授權均為 IP 格式。
free -h 確認實體記憶體與 innodb_buffer_pool_size 關係。tail -f /var/log/mysqld.log 觀察啟動日誌是否有 InnoDB: Cannot allocate memory。skip-name-resolve 是否已設定。netstat -tlnp | grep 3306 確認埠口正常監聽。mysql -h 127.0.0.1 -u root -p。bind-address、防火牆、SELinux/AppArmor。--memory 限制 < innodb_buffer_pool_size 會導致 OOM Kill,容器直接消失,客戶端同樣報此錯誤。innodb_buffer_pool_size=$(awk '/MemTotal/ {print int($2*0.6/1024)"M"}' /proc/meminfo)。