Hatena::Grouprubyist

yyamasakの日記

2008/02/21 (Thu)mysql_lost_connection

RailsMySQLを使っているといつの間にかInternal Server Error 500になってる件 18:04 はてなブックマーク - RailsでMySQLを使っているといつの間にかInternal Server Error 500になってる件 - yyamasakの日記

今までmod_fcgidでやっていたのだけど、最近mongrel_clusterを使うようになったので、いろいろ未経験のトラブルに遭遇する。

以前から「Lost connection to MySQL server...」とかいうエラーにはmysql_retry_lost_connectionというgemを使うという解決法は知っていたんだけど、どういう仕組みかまでは見てなかった。

Railsを使っていて「Lost connection to MySQL server during query」に遭遇したら - Hello, world! - s21g

最近立てたサーバでは上記のエラーはぜんぜん出てこないので、2.0では解決したのかなと思いつつgemを入れてなかった。最近気づいたのだけど、長時間放置していると、いつのまにか500エラーになってたので、ログを見てみると「MySQL server has gone away...」というエラーが残っていた。

メッセージが違うので、上のやつとは違うのだろうと思って、散々いろんなページを検索していたら、

こういうページに出会った。

http://wooga.drbacchus.com/rails-and-mysql-timeouts

それで、

# config/initializer/mysql-reconnect.rb

if ActiveRecord::Base.connection.adapter_name == 'MySQL'

ActiveRecord::Base.connection.instance_eval {@connection.reconnect = true}

end

なんてのを作ってみたんだけど、パフォーマンスに影響しないのかなと思ったので、ここに来て改めてmysql_retry_lost_connectionを見てみることにした。

          if reconnect_lost_connections and exception.message =~ /(Lost connection to MySQL server during query|MySQL server has gone away)/
            reconnect_lost_connections = false
            reconnect!
            retry
          elsif exception.message.split(":").first =~ /Packets out of order/

がーん!「MySQL server has gone away」にも対応してたんだね。

ただでさえ長い名前なのに恐縮ですが、こういう早とちりさんのために

mysql_retry_lost_connection_or_gone_away

に改名して下さい。うそです。