ファイルアップロードでMySQL client is not connected
RailsアプリでアップロードしたファイルをDBに保存する機能があり、
5MB程度のファイルでは問題なかったのですが、10MB程度のファイルをアップロードすると下記のエラーが発生しました。
ActiveRecord::StatementInvalid (Mysql2::Error: MySQL client is not connected):
BLOBのカラムにデータを保存する場合には発生しやすい現象なのでメモしておきます。
MySQLとの接続が切れてしまっていますが、数秒でエラーになるので何かのタイムアウトではなさそうです。
ファイルサイズが大きいので発行されるクエリーが長くなっているのか?
max_allowed_packetの設定を確認します。
mysql> SHOW GLOBAL VARIABLES LIKE '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 16777216 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
max_allowed_packeは16MBです。
max_allowed_packeを変更して動作確認
動作確認のためSET GLOBALでmax_allowed_packetを変更してみます。
mysql> SET GLOBAL max_allowed_packet=33554432;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW GLOBAL VARIABLES LIKE '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 33554432 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
max_allowed_packetを32MBに変更し、10MBのファイルをアップロードしてみると正常にアップロードできました。
my.confでmax_allowed_packeを設定
/etc/my.cnfのmax_allowed_packetを下記のように変更
/etc/my.cnf
max_allowed_packet = 32MB
MySQLを再起動
設定を反映させるためMySQLを再起動します。
systemctl restart mysqld.service
max_allowed_packet
max_allowed_packetについての詳細はこちら
mysqlサーバーがmax_allowed_packetのサイズより大きいパケットを受け取るとER_NET_PACKET_TOO_LARGEが発行され接続が失われます。
10MBのファイルをアップロードしたためにパケットサイズが設定していたサイズより大きくなったために接続が失われ「Mysql2::Error: MySQL client is not connected」が発生したようです。
max_allowed_packetのデフォルトは16MGなので、BLOBのカラムを使用し大きなクエリーを処理する可能性がある場合は設定を増やした方が良いと思います。