首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL「檔案未找到」錯誤 (errno 23/24) 根治:檔案描述符限制調整與表快取優化

     編輯:MySQL 資料庫相關知識

錯誤代碼含義

shell> perror 23
Error code 23: File table overflow
shell> perror 24
Error code 24: Too many open files
shell> perror 11
Error code 11: Resource temporarily unavailable

核心原因:mysqld 同時開啟檔案數超過作業系統/進程限制。

兩大調整方向

方向一:降低 mysqld 同時開啟檔案需求

參數預設調整建議影響
table_open_cache4000 (8.0) / 64 (舊版)視實際併發調整,避免過大減少 .frm/.MYD/.MYI 開啟數
max_connections151實際峰值 + 余量每連線約開啟 2-3 個檔案

方向二:提高作業系統/進程檔案描述符上限

Linux 系統級永久調整

# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535

# /etc/sysctl.conf
fs.file-max = 1000000

systemd 服務級調整 (推薦)

# systemctl edit mysqld
[Service]
LimitNOFILE=65535

mysqld_safe 腳本調整 (舊版)

# 編輯 mysqld_safe
ulimit -n 65535  # 取消註解並修改數值

驗證生效

# 登入 mysql shell
SHOW VARIABLES LIKE 'open_files_limit';
# 或查看進程實際限制
cat /proc/$(pidof mysqld)/limits | grep 'Max open files'

特殊環境注意事項

  • tcsh shell:ulimit 行為異常,請用 sh mysqld_safe 啟動。
  • Docker 容器:docker run --ulimit nofile=65535:65535 ... 或 Dockerfile RUN ulimit -n 65535。
  • 硬限制:root 啟動可突破 hard limit,但生產環境禁用 root 運行 mysqld,需在系統層面提高上限。

監控與告警

  • Open_files / open_files_limit > 80% 觸發告警。
  • Table_open_cache_misses 快速增長 → 需調大 table_open_cache 或檢查 SQL 開啟過多表。

結語

errno 23/24 是資源配額不足的經典信號。現代部署(systemd + 64 位元 OS)下,系統級 LimitNOFILE=65535 + 合理 table_open_cache 即可覆蓋絕多數場景。持續監控開啟檔案比率,提前擴容,避免業務突發中斷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved