MySQL server has gone away エラー

常時起動している Rubyスクリプトで「MySQL server has gone away」というエラーが出てビビリました。ActiveRecord使ってるからいけないのかとか、自分の書き方が悪くて(Rubyが)メモリリークしてるんじゃないかとか、簡単に解決しそうにない方向に想像がいってしまったのですが、ググればすぐ解決方法が見つかりました。「案ずるより産むが易し」、「心配するくらいならググれ」ですね。

どういうエラーか

MySQLのリファレンスマニュアルによると、「MySQLサーバはデフォルト設定では、何も起きない状態が 8 時間続くと接続をクローズします」だそうです。接続がクローズされた状態で MySQLサーバにアクセスにいくと「MySQL server has gone away」となるわけです。

どうするか

8時間、誰もアクセスしないということ自体、サイトの運営としてどうなの? ということがあって、本稼動に入ったらそんなことはなくなるだろうから(希望的観測)、なにもしなくてもいいんじゃね、という考え方もありですが、サーバは動いているけどネットが落ちてるとか、夜中から明け方の8時間、たまたまアクセスがまったくなかったということもあり得るし、アクセスはあったけどキャッシュで事足りて、常時起動のプロセスまでお仕事が回ってこなかったということもあり得るので、なんかしとこうと。

解決策

正統派の解決策としては「/etc/mysql/my.cnf」に「wait_timeout」を設定します。これがデフォルトでは 28800 になっているので、24時間なら 86400 にすれば、1日のうち1回でもMySQLにアクセスがあれば、このエラーは出なくなります。
正統派でない解決策としては、常時起動のスクリプトの方で定期的にMySQLサーバへアクセスにいくというものです。どうせ、ずっと動いているんだから、10分か20分に1回、毒にも薬にもならないSQLを発行したっていいじゃんという非常に前向き(?)な解決方法です。今回はこちらを採りました。
もっと言えば、だいたい常時起動でなにかを動かしていること自体、おかしいわけですから、そういうことは BackgrounDRb なんかに任せるべき、ということです。

参考

  1. ご本家のこちら(→MySQL :: MySQL 5.6 リファレンスマニュアル :: B.5.2.9 MySQL サーバーが存在しなくなりました)に詳しく書いてあります。
  2. MySQLのサーバパラメータについてはこちら(→http://linux.mini13i.gotdns.org/?MySQL%2F%BA%C7%C5%AC%B2%BD%2F%A5%B5%A1%BC%A5%D0%A5%D1%A5%E9%A5%E1%A5%BF)が参考になります。