MySQL 預設 max_connections = 151(5.7+)或 100(舊版),包含 1 個保留給 SUPER 權限使用者的緊急連線。實際可用連線數為 max_connections - 1。連線耗盡時新連線會報錯 ERROR 1040 (HY000): Too many connections,導致服務不可用。調整此參數是資料庫容量規劃的基礎動作。
# 編輯 my.cnf / my.ini
[mysqld]
max_connections = 1000
# 重啟服務生效
systemctl restart mysqld # Linux
net stop mysql && net start mysql # Windows
open_files_limit、table_open_cache、thread_cache_size 需同步調大,否則受限於作業系統檔案描述符上限# 登入 MySQL
mysql -u root -p
# 修改全域變數
SET GLOBAL max_connections = 200;
# 驗證
SHOW VARIABLES LIKE 'max_connections';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
# 編輯 mysqld_safe 啟動腳本
vi /usr/local/mysql/bin/mysqld_safe
# 找到 mysqld 啟動行,在後面加入
-O max_connections=1500
# 範例位置(兩處皆需加入):
$NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=... --datadir=... -O max_connections=1500 >> $err_log 2>&1
# 重啟驗證
service mysqld restart
/usr/local/mysql/bin/mysqladmin -uroot -p variables | grep max_connections
修改 sql/mysqld.cc 中預設值 100 → 1500,重新 ./configure && make && make install。缺點:升級覆蓋、版本管理困難、編譯耗時、易出錯。僅作歷史參考。
| 參數 | 建議值 | 關係說明 |
|---|---|---|
open_files_limit |
max_connections × 5 + 10000 | 作業系統檔案描述符上限,含表、日誌、socket 等 |
table_open_cache |
max_connections × 2 | 表快取數量,避免頻繁開關表 |
thread_cache_size |
min(100, max_connections/10) | 執行緒快取,減少建立/銷毀開銷 |
back_log |
min(3000, max_connections × 1.5) | TCP 連線佇列長度,應對突發連線風暴 |
innodb_buffer_pool_size |
依記憶體規劃 | 連線增加帶來更多查詢,需足夠緩衝池支撐 |
# 檢查目前限制
ulimit -n
cat /proc/sys/fs/file-max
# 永久調整(/etc/security/limits.conf)
mysql soft nofile 65535
mysql hard nofile 65535
root soft nofile 65535
root hard nofile 65535
# 系統層面(/etc/sysctl.conf)
fs.file-max = 1000000
# 套用
sysctl -p
預估峰值併發連線 × 1.5~2(含閒置連線、連線池預留)max_connections - 10(預留管理、監控、備份連線)Threads_connected / max_connections 長期 > 80% 需擴容sort_buffer_size + join_buffer_size + read_buffer_size + thread_stack ≈ 2~10MB(視配置)。1000 連線約需 2~10GB 額外記憶體科學規劃 max_connections,配合完整的監控告警(Max_used_connections 趨勢、連線池使用率)、應用端連線池合理配置、定期壓測驗證,才能構建穩定可擴展的資料庫連線層。