MySQL 錯誤日誌反覆出現 Changed limits: max_open_files: 2048 max_connections: 800 table_cache: 619,表示啟動時依據系統限制與配置自動調整了參數,可能導致效能不穩。本文記錄調整 max_connections、table_cache (即 table_open_cache) 實測消除警告的過程與參數關係解析。
警告含義
- MySQL 啟動時讀取
open_files_limit (受 OS ulimit -n 限制)
- 根據
max_connections、table_cache 計算所需檔案描述符
- 若計算值 > 系統限制,MySQL 會**自動降低**
table_cache、max_connections 並記錄警告
實測調整過程
| 嘗試 | max_connections | table_cache | 結果 |
| 初始 | 800 | 619 | 警告頻繁 |
| 調整 1 | 1024 | 64 | 警告更多 |
| 調整 2 (成功) | 800 | 500 | 警告消失 |
參數關係公式 (簡化)
所需檔案描述符 ≈ max_connections * 5 + table_cache * 2 + 100
-- 實際更複雜,涉及 table_definition_cache、binlog、InnoDB 等
系統層面必做:提升 open_files_limit
# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
# systemd (CentOS 7+/Ubuntu 16.04+)
# /etc/systemd/system/mysql.service.d/limits.conf
[Service]
LimitNOFILE=65535
# 重載生效
systemctl daemon-reload
systemctl restart mysql
MySQL 配置建議值
[mysqld]
open_files_limit = 65535 # 明確宣告,需系統支援
max_connections = 1000 # 視記憶體/負載調整
table_open_cache = 2000 # 5.6+ 參數名,舊版 table_cache
table_definition_cache = 1400 # 表定義緩存,獨立於 table_open_cache
驗證生效
SHOW GLOBAL VARIABLES LIKE 'open_files_limit';
SHOW GLOBAL VARIABLES LIKE 'max_connections';
SHOW GLOBAL VARIABLES LIKE 'table_open_cache';
SHOW GLOBAL STATUS LIKE 'Open_tables';
SHOW GLOBAL STATUS LIKE 'Opened_tables'; -- 持續增長表示 cache 不夠
核心原則
- 先調大系統
ulimit -n / systemd LimitNOFILE
- 再設 MySQL
open_files_limit 略小於系統值
- 按實際併發設
max_connections (通常 500-2000)
table_open_cache 設為 max_connections * N (N=2-4),觀察 Opened_tables 增長調整
補充:Windows 下在 my.ini 直接設 max_connections=1000、table_cache=500 並重啟服務即可,無系統限制層。
copyright ©
萬盛學電腦網 all rights reserved