MySQL で、server has gone away エラー頻発

wait_timeout はデフォルトの 8 時間。ただし、別にタイムアウトしてるわけではない。起動してすぐに1分に一回くらい MySQL が居なくなる症状。

予想だにしない症状だったが、

my $dbh = DBI->connect( $dsn, $user, 
  $pass, {mysql_auto_reconnect=>1}) 
    or croak 'connection failed:';

という感じで、{mysql_auto_reconnect=>1} を指定することで完璧に解消した。これ使えるようになったのは最近のバージョンなのかな?(MySQL5.0 以降?)

ブチブチ切れちゃうってのは環境の方の問題だと思われるので、放置することに。こういうオプション、機能が追加されてるということからしても、MySQL では結構発生することなのだろう。

ちなみに、トランザクション中にこの切断が発生すると、reconnect してもトランザクションまで回復してくれるわけじゃないので、意味が無い。今回の用途ではトランザクションが無かったので、これで問題ない。(Q4M を使っていたのだ)

apache の DBD から MySQL 接続する際にこの症状が起きる場合も同様に reconnect を設定することが出来る。

apache の conf ファイルの DBD 接続文字列に、以下のように追加するだけだ。

host=****,user=****,pass=****,dbname=****,sock=****,reconnect=1

DBD のソース見ると、「実際の接続の前に、reconnect を設定しろとマニュアルに書いてある。接続の後で設定しろという人も居る。」とコメント書きした上で、接続の前後両方にこの設定を実施していて笑った。