Rails の Migration で「Lost connection to MySQL server during query」と言われた際の対処方法
Published: 2019/3/13
TL; DR
read_timeout: タイムアウト秒数
を config/database.yml
に書く。
詳細
Lost connection to MySQL server during query
と言われながら、Rails で MySQL の既存の(巨大な)テーブルに index を追加する migration が失敗した。 ので、その原因を調査した際のメモ。 いろいろな情報がすごくミスリーディングだったりするので、ここにまとめを作っておく。
まず、 MySQL サーバーはコネクションに対して、それがとてつもない Slow Query だったからといって、勝手に abort したりするようなことはしない。 Automatic kill/timeout slow queries in MySQL - Stack Overflow にもあるように、そのようなことを実現したかったら、自分で PROCESSLIST を監視して、時間がかかっているクエリを kill するようなスクリプトを書かなければならない。 参考までに、 wait_timeout 系は、 IDLE なコネクション時間に対しての判定である模様。参考
クライアント側の設定として、参考になるのはこのページ。 Deep Dive into Database Timeouts in Rails
ここで、 read_timeout が紹介されている。何かと言うと、何もサーバーから応答(通信)がない間、どれぐらいの秒数それが継続すれば、サーバーが死んでいると判断するかのパラメータ。 デフォルトでは 30 分設定なので、あまり意識することがないが、今回みたいに Migration で長めの操作を行わなければならない場合にはまりやすい。
Tags: railsmysql
関連記事
ローカルで mysql をサクッと立てたい時に使うコマンド
2023/10/26
Rails の view では、相対パス(キー)のロケールが使える
2023/9/7
(Rails) Controller 等で helper を呼ぶ方法
2023/6/15
factory_bot と必須 association
2023/4/23