萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 警告「Changed limits: max_open_files max_connections table_cache」參數調優實戰 MySQL 警告「Changed limits: max_open_files max_connections table_cache」參數調優實戰

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 * 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 不夠

核心原則

  1. 先調大系統 ulimit -n / systemd LimitNOFILE
  2. 再設 MySQL open_files_limit 略小於系統值
  3. 按實際併發設 max_connections (通常 500-2000)
  4. table_open_cache 設為 max_connections * N (N=2-4),觀察 Opened_tables 增長調整

補充:Windows 下在 my.ini 直接設 max_connections=1000、table_cache=500 並重啟服務即可,無系統限制層。

copyright © 萬盛學電腦網 all rights reserved
嘗試max_connectionstable_cache結果
初始800619警告頻繁
調整 1102464警告更多
調整 2 (成功)800500警告消失