LoginSignup
6
4

More than 5 years have passed since last update.

大量データ投入検証時のMySQLタイムアウトを解決する

Last updated at Posted at 2018-04-20

2018/06/25
サーバー側ではなくアプリ側で対応しよう、という旨追記しました。

Ruby + Rails + MariaDB

開発環境で大量データの投入検証をしようとすると、下記のエラーが発生。
長いinsert文も一緒に吐かれるので混乱したけど、
つまりはMysqlがタイムアウトしてしまっていました。

Mysql2::Error: MySQL server has gone away

原因としてはコネクションプールの不足なんかも挙げられるようですが、
私の場合は単純にmax_allowed_packetが足りていないことでした。
my-large.cnfを元にしていたのだけど、足りなかったらしい。

/etc/my.cnf.d/server.cnf
[mysqld]
max_allowed_packet = 1000M   # 1M->1000Mに修正。

systemctl restart mysqld.serviceでOK。

ちなみにプール数を増やす場合、タイムアウトを伸ばす場合、
再接続を行う場合(reconnect: true)database.ymlで設定できる。

2018/06/25追記
状況によりけりですが、冷静に考えるとserver.cnfをいじるよりも
アプリ側でSQLを適宜分割して発行する方がいいと思います。
大量データの投入って1秒を争わないと思うので。

参考リンク
“MySQL server has gone away” with Ruby on Rails
ActiveRecordのコネクションプールの理解を深める

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4