max_connections 參數直接決定 MySQL 能承載的並發連接上限。默認值僅 151,生產環境極易觸發 Too many connections 錯誤。本文覆蓋查看、修改、監控全流程。
mysqladmin -uroot -p variables | grep max_connections
mysql -uroot -p -e "SHOW VARIABLES LIKE 'max_connections';"
或進入客戶端後:
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected'; -- 當前打開的連接數
SHOW STATUS LIKE 'Max_used_connections'; -- 歷史峰值連接數
SHOW PROCESSLIST; -- 詳情列表
健康度判斷: 若 Max_used_connections / max_connections > 80%,需擴容或優化。
編輯 /etc/my.cnf:
[mysqld]
max_connections = 1000 # 根據業務評估調整
重啟服務:systemctl restart mysqld。
SET GLOBAL max_connections = 1000;
注意: 動態調整僅影響新建連接,不斷開現有連接。配合配置文件修改實現「即時生效+持久化」。
| 風險點 | 影響 | 對策 |
|---|---|---|
| 內存佔用 | 每個連接消耗 sort_buffer_size + join_buffer_size + read_buffer_size 等線程私有內存 | 適當降低各 Buffer 默認值(如 256K→128K),總內存 = max_connections × 線程內存 + 全局內存 |
| 文件描述符 | 每連接需 1-2 個 fd,受 open_files_limit 限制 | 同步調大 open_files_limit = 65535 及系統 ulimit -n |
| CPU 上下文切換 | 高併發活躍連接導致 CPU 飆升 | 引入連接池、優化慢 SQL、啟用 Thread Pool(Percona/AliSQL) |
[mysqld]
max_connections = 2000
open_files_limit = 65535
thread_cache_size = 100 # 緩存線程減少創建銷毀開銷
back_log = 200 # 監聽隊列長度
wait_timeout = 28800 # 空閒連接超時(8h)
interactive_timeout = 28800
# 線程私有內存適度收緊
sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 256K
mysql_global_variables_max_connections、mysql_global_status_threads_connected、mysql_global_status_max_used_connections。Threads_connected / max_connections > 0.8 持續 5 分鐘觸發。SHOW PROCESSLIST 或 performance_schema.threads,識別連接泄漏(長時間 Sleep 連接)。合理規劃 max_connections,配合連接池與慢 SQL 治理,是保障 MySQL 高併發穩定運行的基石。