max_connections 控制 MySQL 最大並發連接數,默認 151(5.6+),實際上限 16384。本文詳細講解參數特性、三種調整方式、資源影響模型、報錯排查與生產配置建議。
| 屬性 | 說明 |
|---|---|
| 默認值 | 151(MySQL 5.6+),100(舊版) |
| 實際上限 | 16384(硬編碼),超過自動截斷 |
| 隱藏保留 | 始終保留 1 個連接給 SUPER 權限用戶(管理員應急登錄) |
| 動態修改 | 支援 SET GLOBAL 即時生效,無需重啟 |
| 資源佔用 | 每連接 ~256KB 線程棧 + 緩存/網絡緩衝,**佔用隨活躍度增長,非線性** |
# sql/mysqld.cc
{"max_connections", OPT_MAX_CONNECTIONS, ..., 100, 1, 16384, ...}
# 修改默認值 100 → 1000,重新編譯安裝
# /etc/my.cnf [mysqld] max_connections = 2000 # 重啟生效 systemctl restart mysqld
mysql -uroot -p SET GLOBAL max_connections = 3000; -- 即時生效 SELECT @@MAX_CONNECTIONS; -- 驗證
注意:動態修改僅維持到下次重啟,必須同步更新 my.cnf。
SHOW STATUS LIKE 'Threads_connected';SHOW PROCESSLIST; 或 SELECT * FROM information_schema.PROCESSLIST WHERE COMMAND != 'Sleep';close()。KILL 長事務、優化 SQL、加索引。SET GLOBAL max_connections = 当前值 * 1.5; 爭取排查時間。| 場景 | 建議值 | 配套參數 |
|---|---|---|
| 小型應用(單機、<500 QPS) | 500-1000 | wait_timeout=60, interactive_timeout=60 |
| 中型應用(主從、2000-5000 QPS) | 2000-4000 | thread_cache_size=64, back_log=200 |
| 大型應用(分庫分表、高併發) | 5000-10000 | open_files_limit=100000, net_read_timeout=30 |
| 極高併發(萬級 QPS) | 10000-16384 | 需配合連接池、ProxySQL、內核參數調優 |
wait_timeout / interactive_timeout:空閒連接自動斷開,防止連接池洩漏佔滿槽位。thread_cache_size:配合 max_connections 設置(~1/32),減少線程創建開銷。open_files_limit:≥ max_connections × 3(InnoDB file_per_table),避免 "Too many open files"。back_log:TCP 監聽隊列長度,建議 max_connections / 10,防止連接風暴丟包。# Prometheus 告警示例
- alert: MySQLConnectionsHigh
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
for: 2m
labels:
severity: warning
annotations:
summary: "MySQL 連接數超過 80% 閾值"
description: "實例 {{ $labels.instance }} 連接使用率 {{ $value | humanizePercentage }},請排查連接洩漏或擴容。"
核心原則:**配置略大於業務峰值 30-50%**,配合連接池復用、空閒超時回收、監控告警,將「Too many connections」變為可控事件而非事故。