B.5.2.18 'File' が見つかりません、および同様のエラー

MySQL から 「エラー '...' が見つかりません (エラー番号: 23)」「ファイル ... をオープンできません (エラー番号: 24)」、あるいは「エラー番号 23」または「エラー番号 24」のその他のエラーを受け取る場合は、MySQL サーバーに十分なファイルディスクリプタが割り当てられていないことを意味します。perror ユーティリティーを使用すると、エラー番号の意味の説明を取得できます。

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

ここでの問題は、mysqld が同時にオープンしたままにしようとしているファイルが多すぎることです。一度に多数のファイルをオープンしないように mysqld に通知するか、mysqld が使用できるファイルディスクリプタの数を増やします。

一度にオープンするファイル数を少なくするように mysqld に通知するには、table_open_cache システム変数の値 (デフォルト値は 64) を減らすことによってテーブルキャッシュを小さくします。セクション8.4.3.1「MySQL でのテーブルのオープンとクローズの方法」で説明されているように、状況によっては、サーバーがキャッシュサイズを一時的に拡張しようとする可能性があるため、これによってファイルディスクリプタの不足を完全に防ぐことはできません。max_connections の値を減らすことによっても、オープンファイルの数が減少します (デフォルト値は 100)。

mysqld が使用できるファイルディスクリプタの数を変更するには、mysqld_safe--open-files-limit オプションを使用するか、open_files_limit システム変数を設定します。セクション5.1.4「サーバーシステム変数」を参照してください。これらの値を設定するもっとも簡単な方法は、オプションファイルにオプションを追加することです。セクション4.2.6「オプションファイルの使用」を参照してください。オープンファイルの制限の設定をサポートしていない古いバージョンの mysqld を使用している場合は、mysqld_safe スクリプトを編集できます。このスクリプトには、コメントアウトされた行 ulimit -n 256 があります。# 文字を削除してこの行をコメント解除し、数字 256 を変更して、mysqld が使用できるファイルディスクリプタの数を設定します。

--open-files-limit および ulimit を使用すると、ファイルディスクリプタの数を増やすことができますが、オペレーティングシステムが課している制限が上限となります。mysqld_safe または mysqldroot として起動した場合にのみオーバーライドできる堅固な制限もあります (この場合、起動後に root として実行され続けないように、--user オプションを指定してサーバーを起動する必要もあります)。各プロセスで使用できるファイルディスクリプタの数に関するオペレーティングシステムの制限を緩める必要がある場合は、システムのドキュメントを参照してください。

注記

tcsh シェルを実行している場合、ulimit は機能しません。また、tcsh では、現在の制限を問い合わせたときに不正な値が報告されます。この場合は、sh を使用して mysqld_safe を起動してください。


User Comments
  Posted by Thierry Coppey on July 23, 2006
This hint works as well with "errno: 9" (bad file descriptor) message. I suppose most of filesystem errors (may appear randomly on tables) are solved with this tweak.
I suggest you to edit my.cnf (usually /etc/my.cnf) and add the following line :

open-files=2048

Then launch the mysql (linux/bsd) server by doing (with sh)

# ulimit -n 2048
# [your current mysqld launching command]

Where 2048 is the number of files you allow MySQL to open.
  Posted by Emmanuel KARTMANN on September 28, 2010
On a Windows server we experienced similar problems (running out of file handles) with a slightly different error code (22) and messages:

Can't create/write to file #sql105c_452d_0.MYD' (Errcode: 22) Error_code: 1
Can't create table 'temporary.mytable' (errno: 22) Error_code: 1005

The only workaround we found was to lower some configuration parameters:

SET GLOBAL table_open_cache = 128 /* WAS: 1024 */
;
SET GLOBAL max_connections = 350 /* WAS: 1000 */
;

The rationale behing this settings is:
* Less open tables => less opened files.
* Less connections => less temporary tables => less opened files.

Please note that error 22 is really unexpected/awkward it this context - it means:
OS error code 22: Invalid argument

Regards,

E.

Sign Up Login You must be logged in to post a comment.