"MySQL server has gone away" のメモ

※ このエントリは、はてなグループ終了に伴う、サブブログからの引越エントリ(2010/07)です。
※ 情報が古い可能性もありますので、ご留意ください。



原因はいくつかあるようで、多くの場合は、タイムアウトして接続がクローズするケースのようですが、遭遇したのは、クエリのサイズオーバーの模様。(心当たり有)

設定値は、 "mysqladmin variables" で確認する。

You can also get these errors if you send a query to the server that is incorrect or too large. If mysqld receives a packet that is too large or out of order, it assumes that something has gone wrong with the client and closes the connection. If you need big queries (for example, if you are working with big BLOB columns), you can increase the query limit by setting the server's max_allowed_packet variable, which has a default value of 1MB.

http://dev.mysql.com/doc/refman/5.1/ja/gone-away.html

間違ったクエリか大きすぎるクエリをサーバに送信した場合も、このエラーが発生する可能性があります。mysqld は大きすぎるか異常のあるパケットを取得すると、クライアントに何か問題が発生したとみなし、接続をクローズします。大きなクエリが必要な場合(たとえば、大きな BLOB カラムを使用している場合)、mysqld を -O max_allowed_packet=# オプション(デフォルト 1MB)で起動して、クエリ制限を引き上げることができます。拡張メモリは要求に応じて割り当てられます。そのため、mysqld は、ユーザが大きなクエリを発行するときや、mysqld が大きな結果レコードを返す必要のあるときだけ、メモリを増やして割り当てます。

http://dev.mysql.com/doc/refman/4.1/ja/gone-away.html

参考

  1. 保持しているコネクションが、デフォルトでは8時間以上、やりとりが無かった時に切断される。PHP でコネクションプーリングしている場合が多い。
  2. ロジックの誤りでコネクションを閉じちゃっている場合。例えば、マルチスレッドのアプリケーションで、別のスレッドが閉じている、とか。
  3. クライアント側からタイムアウトが通知された場合。
  4. クライアント側の自動再接続機能が無効にされている状態で、サーバ側でタイムアウトが発生した場合。
  5. 巨大なクエリーや誤ったクエリーを投げた場合。
  6. INSERT や REPLACE で、大量の行をソートしなければいけないような場合。
  7. クライアントバージョンが 4.0.8 より古くて、サーババージョンが 4.0.8 以降の場合に、16MB 以上のパケットを送った場合。

稀なケースとして、

  1. 管理者が MySQL のサーバを止めちゃった場合。
  2. クライアントがサーバと別のホストで動いていて、接続するための権限を十分に持っていない場合。
  3. Windows の場合、たぶん、タイムアウトが起きてコネクションが閉じられたんだけど、OS から十分なエラー情報が得られないので、結果、このエラーメッセージになる。
  4. 5.0.19 よりで、自動再接続フラグが有効になっていても、うまく再接続出来ない場合がある。
  5. 名前解決に失敗しているケース。
  6. --skipe-network オプション付きでサーバが起動されている場合。
  7. アプリケーションの全ての子プロセスが、同じコネクションを使おうとしている場合。
  8. ファイヤーウォールで MySQL サーバが使うポートがブロックされた場合。
  9. クエリーを処理中のサーバが死んじゃった場合。
MySQL5.0.87を現在利用していて、「MySQL server has gone away… - 人力検索はてな