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

関連記事