2008/02/21 (Thu)mysql_lost_connection
■ RailsでMySQLを使っているといつの間にかInternal Server Error 500になってる件 
今まで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}
なんてのを作ってみたんだけど、パフォーマンスに影響しないのかなと思ったので、ここに来て改めて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
に改名して下さい。うそです。