mysqlで「server has gone away」というエラーが返ってくる

技術関係

おそらく、Mysqlのセッションがタイムアウトしてしまっていると思われる。確かに若干sleepを長くしすぎていたかも

とりあえず、セッションの有効時間を調べてみる
SHOW VARIABLES LIKE ‘wait_timeout’

英語ですが、下記のページがまとまっていると思います。
http://blog.taragana.com/index.php/archive/mysql-tip-mysql-servh…
ざっくり概要を訳してみると(間違っていたらゴメンナサイ…)

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

稀なケースとして、

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

関係ありそうなもの、無さそうなもの、玉石混交ですが、参考まで。

なんとなく、PHP のコネクションプーリングの問題のような気がするけど。

http://q.hatena.nh.jp/1267971507

また、PHPにはmysql_pingというmysqlとの接続を確認して、切断されていたら再接続する関数がある様子
MySQL server has gone away – 揮発性のメモ

ただし、MySQL 5.0.13 以降、自動再接続機能は使えなくなったようなのでバージョンに注意
PHP: mysql_ping – Manual

タイトルとURLをコピーしました