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 を設定しろとマニュアルに書いてある。接続の後で設定しろという人も居る。」とコメント書きした上で、接続の前後両方にこの設定を実施していて笑った。