| 方式 | 生效時間 | 持久性 | 適用場景 |
|---|---|---|---|
動態修改 SET GLOBAL | 立即 | 重啟失效 | 緊急擴容、臨時測試、無重啟窗口 |
配置文件 my.cnf/my.ini | 重啟後 | 永久 | 生產標準化、版本控制、合規審計 |
| 參數 | 建議值 | 原因 |
|---|---|---|
thread_cache_size | max_connections / 5 (上限 200-500) | 減少線程創建/銷毀開銷 |
back_log | max_connections / 5 | TCP 接受隊列長度,防突發連接丟包 |
open_files_limit | max_connections * 5 (至少 65535) | 表緩存、日誌、臨時文件句柄總和 |
table_open_cache | max_connections * 2 (上限 10000+) | 每連接可能打開多表 |
max_prepared_stmt_count | max_connections * 10 | PreparedStatement 緩存上限 |
OS ulimit -n | 65535+ | 進程級文件描述符硬限制,MySQL 無法突破 |
# 粗略估算公式 (單位:字節)
Total_MySQL_Memory ≈
innodb_buffer_pool_size
+ key_buffer_size
+ (read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size + binlog_cache_size + thread_stack) * max_connections
+ max_connections * thread_stack (默認 256KB-1MB)
+ 其他全局緩存
# 原則:Total_MySQL_Memory < 物理內存 * 0.7-0.8 (留 20-30% 給 OS/FS Cache/其他進程)
若內存不足,**堅決不調大 max_connections**,改用連接池、ProxySQL、讀寫分離、分庫分表降低單實例並發壓力。
#!/bin/bash
# validate_mysql_config.sh
EXPECTED_MAX_CONN=1000
ACTUAL=$(mysql -N -e "SHOW VARIABLES LIKE 'max_connections';" | awk '{print $2}')
if [ "$ACTUAL" -ne "$EXPECTED_MAX_CONN" ]; then
echo "FAIL: max_connections=$ACTUAL, expected=$EXPECTED_MAX_CONN"
exit 1
fi
echo "OK: max_connections=$ACTUAL"
修改 max_connections 不是單純改一個數字,**必須伴隨文件描述符、線程緩存、表緩存、內存預算的系統級聯調整**,並通過配置文件持久化、驗證腳本自動化、變更管理流程管控。切記:**連接數上限是保護系統穩定的最後防線,盲目調大等於自殺**。