max_allowed_packetの設定変更

テストと動作確認のために大量のデータをズドーンとinsertしたところ、下記のエラーが発生して少し悩んだので、解決方法を整理します。

 packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server

max_allowed_packet設定値の確認

mysqlのDBに接続し、下記コマンドを実行。

show variables like 'max_allowed_packet';

出力結果はbyte単位で表示されます。

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 4194304 |
+--------------------+---------+
1 row in set (0.01 sec)

max_allowed_packetの設定変更

コマンドで設定変更

下記コマンドでmax_allowed_packetの設定変更できます。

# max_allowed_packetを100MByteに変更
set global max_allowed_packet = 100 * 1024 * 1024;

これですんなりいけばよいですが、私の環境はRDSだったのですが、下記のようなエラーが発生しました。

Access denied; you need (at least one of) the SUPER privilege(s) for this operation

my.cnfファイルで設定変更

プロファイルを設定し、mysqlの再起動で設定を反映できるようです。

プロファイルの場所は mysql --help で確認できます。

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

/etc/mysql/my.cnf を確認すると下記のような文字列がありました。

!includedir /etc/mysql/conf.d/

/etc/mysql/conf.d/ディレクトリをインクルードしているようなので、そちらのファイルを開き、下記を追記しました。

[mysql]
max_allowed_packet=100MB

AWSのRDSにて設定変更する場合

AWSのRDSの場合はマネジメントコンソールから設定変更できるようです。

現プロダクトはTerraformで構成管理していたので、Terraformの定義を変更し対応しました。

# max_allowed_packetを100MByteに設定

resource aws_db_parameter_group db_parameter_group_mysql5_7 {
# 中略
  parameter {
    apply_method = "immediate"
    name         = "max_allowed_packet"
    value        = "104857600"
  }
}

まとめ

これで大量のレコードを挿入し放題です。やったぜ!