MySQL 更新伺服器後無法開啟檔案:errno: 24

MySQL 更新伺服器後無法開啟檔案:errno: 24

烏班圖:12.04 LTS(Linux mysql02 3.2.0-40-generic #64-Ubuntu SMP 3 月 25 日星期一 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux)

MySQL:Ubuntu 發行版 5.5.31

裝備:已刪除!

伺服器已經穩定運作一年多了。然後這個週一 MySQL 開始出現故障。更新導致了該問題,但我們無法確定問題所在。我們甚至嘗試回滾到 MySQL 5.5.30,但沒有成功。我們於 31 年 5 月 5 日返回。

MySQL 錯誤日誌條目:

130430  7:55:46 [ERROR] Error in accept: Too many open files
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)

看來我們遇到了 ulimit 問題。我們已經完全刪除了APPARMOR。我們增加了/etc/security/limits.conf但仍然沒有運氣:

# Out of desperation....
* soft  nofile  49152
* hard  nofile  65536

# No effect!?!!?
#mysql  soft  nofile  49152
#mysql  hard  nofile  65536

並展示限制.conf工作中:

root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files                      (-n) 49152

root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files                      (-n) 65536

以下是重要條目我的cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

然而:

root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit                                  | 1024

我們完全陷入困境和沮喪。任何幫助將不勝感激。

答案1

作業系統:Ubuntu (Debian) 部署

MySQL 伺服器選項:開啟文件限制

Debian 好像是這樣的暴發戶不使用中定義的參數/etc/security/limits.conf,所以當你透過以下方式啟動 mysql 時服務命令(因此,在 upstart 下),它會覆蓋這些定義的限制並使用預設的 1024。

解決辦法是修改mysql.conf定義 upstart 服務的文件,它位於/etc/init/mysql.conf並添加以下行預先啟動堵塞:

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000

參考:

答案2

在 Ubuntu 15.10 上也有同樣的問題。

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758- 帶來了解決方案:

  1. 檢查 /lib/systemd/system/mysql.service 或 /lib/systemd/system/mysqld.service 是否存在
  2. (就我而言)如果沒有,請建立 /lib/systemd/system/mysql.service 並將內容複製到此文件https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/comments/11並將這兩行添加到文件中的某處

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. 如果一個或兩個檔案都存在,請檢查是否包含這兩行:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. 執行systemctl daemon-reload

……一切都應該沒問題。

答案3

由於上述方法都沒有為我解決問題(只會導致系統記憶體不足),這是我找到的解決方案:

/etc/mysql/my.conf需要增加 MySQL 的內部 open_files_limit。所以暫時將其新增至配置中並重新啟動MySQL。

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

運行給你的操作後開啟的文件太多錯誤,您可以將組態變更回預設值並重新啟動MySQL。

答案4

感謝您提供解決方法。但對我來說,這個問題被另外兩個事實所掩蓋。

  1. 我的資料目錄與預設安裝不同。由於歷史和技術方面的多種原因。
  2. 我是從一個非常舊的安裝升級的,它經歷了許多後向和前向端口。新安裝的 MySQL 5.5 首次啟動時,InnoDB 引擎未啟動(設定檔中停用了內部實現,但 5.5 中不存在先前版本中可用的插件),並且在未實際升級的情況下創建了升級標記任何桌子。

修復InnoDB問題後,仍吐槽

mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)

我必須在根控制台中啟動 mysqld 並手動重新啟動

/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force

然後伺服器開始顯示資料庫,但無法存取某些表。您透過增加限制的解決方法解決了其餘問題,謝謝!

相關內容