MySQL はサーバーの更新後にファイルを開くことができません: errno: 24

MySQL はサーバーの更新後にファイルを開くことができません: errno: 24

Ubuntuの場合: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)

マイグレーション:Ubuntu ディストリビューション 5.5.31

装甲:削除されました!

サーバーは 1 年以上安定して稼働していました。しかし、今週の月曜日から MySQL が機能しなくなりました。アップデートが原因で問題が発生しましたが、原因がわかりません。MySQL 5.5.30 にロールバックしようとしましたが、うまくいきませんでした。5.5.31 に戻しました。

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を完全に削除しました。制限それでもまだ運がない:

# 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

OS:Ubuntu (Debian) のデプロイメント

MySQL サーバー オプション:オープンファイル制限

Debianは成り上がり者定義されたパラメータを使用しない制限なので、mysqlを起動するとサービスコマンド (および upstart の場合) では、定義された制限を上書きし、デフォルトの 1024 を使用します。

解決策は、設定ファイルupstartサービスを定義するファイルは、設定ファイルそして次の行を追加します前に開始前ブロック:

# 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でも同じ問題が発生しました。

参考:- 解決策をもたらしました:

  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ファイルのどこかに2行追加します

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. いずれかまたは両方のファイルが存在する場合は、次の 2 行が含まれているかどうかを確認します。

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. 実行するsystemctl daemon-reload

...そしてすべてはうまくいくはずです。

答え3

上記のいずれの方法でも問題は解決しませんでした (システムのメモリ不足につながるだけ)。私が見つけた解決策は次のとおりです。

MySQL の内部 open_files_limit を増やす必要があり/etc/mysql/my.confます。そのため、これを一時的に構成に追加し、MySQL を再起動します。

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

操作を実行すると、開いているファイルが多すぎますエラーが発生した場合は、設定をデフォルトに戻して MySQL を再起動してください。

答え4

回避策をありがとうございます。しかし、私にとっては、この問題は他の 2 つの事実によって影が薄くなっています。

  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

その後、サーバーはデータベースを表示し始めましたが、一部のテーブルにアクセスできませんでした。制限を増やすという回避策により、残りの問題は解決しました。ありがとうございます!

関連情報