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のコネクションプールの理解を深める