Edited at

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

More than 1 year has passed since last update.

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