Close icon
2022月10日13日

ファイルアップロードで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のカラムを使用し大きなクエリーを処理する可能性がある場合は設定を増やした方が良いと思います。



アトトックラボとは

株式会社アトトックメンバー が技術の話、デザインの話、キャラクターの話、ときどき脱線してガジェットの話やライフハックの話など好きなことを書いています。


連載記事


最近の記事


タグ