Edited at

MySQLのエラーと対策まとめ

More than 1 year has passed since last update.

PHPからMySQLに接続していて出たエラーと対策など。

間違っている内容などあればコメントで教えて頂ければ嬉しいです。


php側で出たエラー


MySQL server has gone away


【原因】(3パターン)

MySQL 4.1 リファレンスマニュアルより

http://mirror.metrocast.net/mysql/doc/refman/4.1/ja/gone-away.html


  • 1.サーバータイムアウト


MySQL server has gone away エラーの最も一般的な原因は、サーバがタイムアウトして接続がクローズしたことです。

デフォルトでは、何も起きない状態が 8 時間続くと、サーバは接続をクローズします。

この時間は、mysqld 開始時に wait_timeout 変数を設定することで変更できます。



  • 2.接続をcloseしている


MySQL server has gone away エラーが発生する一般的なもう一つの原因としては、MySQL とのコネクション上で ``close'' を発行し、クローズしたコネクションでクエリを実行しようとしたことが考えられます。



  • 3.クエリが大きすぎる or クエリの最大サイズの設定が小さい


間違ったクエリか大きすぎるクエリをサーバに送信した場合も、このエラーが発生する可能性があります。

mysqld は大きすぎるか異常のあるパケットを取得すると、クライアントに何か問題が発生したとみなし、接続をクローズします。

大きなクエリが必要な場合(たとえば、大きな BLOB カラムを使用している場合)、mysqld を -O max_allowed_packet=# オプション(デフォルト 1MB)で起動して、クエリ制限を引き上げることができます。

拡張メモリは要求に応じて割り当てられます。そのため、mysqld は、ユーザが大きなクエリを発行するときや、mysqld が大きな結果レコードを返す必要のあるときだけ、メモリを増やして割り当てます。



【対策】


  • 1.サーバータイムアウト


1)タイムアウトの設定を変更する。

以下のクエリを実行(8時間)

set global wait_timeout = 28800;

2)定期的にクエリを実行する

SELECT 1; などの何もしないクエリをタイムアウトになる前に実行する。



  • 2.接続をcloseしている


1)全ての処理が終わるまでcloseを呼ばないようにする。

2)closeした後に再コネクトする。



  • 3.クエリが大きすぎる or クエリの最大サイズの設定が小さい


max_allowed_packet の設定を変更する



MySQL側で出たエラー


MySQLログのパス

/var/log/mysqld.log


InnoDB: Error: pthread_create returned 11

【原因】

ファイルディスクリプタ数の上限に引っかかった。

【対策】

ulimitコマンドでファイルディスクリプタ数の上限値を変更すれば解決。


とりあえず無制限にする。



ulimit -s unlimited

service mysqld restart



その他参考になりそうなリンク


オマケ - バージョン毎のリファレンス

毎回探すのに苦労するので・・・