概要
- phpmyadminでDUMPファイルをインポートしたら、パケットサイズの超過エラーが表示されました。今回はそのエラー解決方法を記します。
エラー内容
- Dockerでphpmyadminを使ってデータベースにDUMPファイル(
.sql.zip
となっているもの)をインポートしたら、以下のエラーが表示されました。- phpmyadminの公式サイト:インポートとエクスポート
#1153 - 'max_allowed_packet'よりも大きなパケットを受信しました。
- このエラーは、MySQLサーバーが受信したパケットのサイズが、許可されている最大パケットサイズ(
max_allowed_packet
)を超えていることを示しています。 - 解決するためには、パケットの最大容量の変える必要があるので、
max_allowed_packet
設定値を変更します。 - 変更は
my.cnf
ファイルで行います。
補足: 最大パケットサイズとは
- ネットワークを介して転送されるデータパケット(データ通信を行う際に分割されたデータの塊)の最大サイズのこと。
- パケット:データを転送する際に分割される「荷物」のようなもの
- MySQLの場合、クライアントがサーバーに送信するSQL文や、サーバーがクライアントに送信する結果セットなどがデータパケットとして転送されます。
- MySQLは、デフォルトで
max_allowed_packet
を16MB
に設定しています。
この変数のデフォルト値が小さいのは、クライアントとサーバーの間の不正なパケットを捕捉するための予防措置であり、誤って大きなパケットが使用されてメモリー不足にならないようにするためでもあります。
引用元: B.3.2.8 パケットが大きすぎます
- ただし、
max_allowed_packet
をあまりに大きな値に設定すると、MySQLのパフォーマンスに悪影響を与える可能性があるので、ネットワークの帯域幅などを踏まえて適切に設定してください。
解決方法は、設定ファイルのマウントorボリュームの永続化
- Dockerコンテナを使って起動している場合、コンテナの中に入って
my.cnf
ファイルを編集したところで、コンテナを一度閉じてしまうと、ファイルシステムが保存されず消えてしまいます。そうしないためには二つの方法があります。- データボリュームを永続化したり、バインドマウントを使用したりして、消えないようにする
- コンテナ起動時に任意の
my.cnf
ファイルを適用するようにする
- 今回は、2番目の方法をとることにしました。
実施手順
①my.cnf
ファイルで最大パケットサイズを変更する
②docker-compose.yml
の設定を変更する
①my.cnf
ファイルで最大パケットサイズを変更する
-
my.cnf
ファイルに以下のように追記します。この場合だと、MAXが512MBになります。
my.cnf
[mysqld]
max_allowed_packet=512M
- 設定ファイルは、通常
/etc/mysql
にあるmy.cnf
ファイルだと思いますが、以下のようにMySQLサーバーの設定ファイルを複数のファイルに分割して管理することができます。
$ cd /etc/mysql
$ cat my.cnf
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
-
!includedir
ディレクティブは、MySQLサーバーが起動する際に読み込む追加の設定ファイルを指定するためのものです。 - それぞれ以下のように使われる場合があります。
-
/etc/mysql/conf.d/
ディレクトリに格納されたファイル: データベースの設定に関するオプション -
/etc/mysql/mysql.conf.d/
ディレクトリに格納されたファイル: MySQLサーバー自体の設定に関するオプション
-
-
mysqld.cnf
に[mysqld]
のことがまとめて記載されていたので、今回はそちらに追記しました。
mysqld.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
max_allowed_packet=512M
②docker-compose.yml
の設定を変更する
-
docker-compose.yml
ファイルに以下を追記します。
version: "3"
services:
mysql:
image: mysql:latest
volumes:
- ./mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- これにより、ローカルマシン上の
mysqld.cnf
ファイルを、MySQLコンテナ内の/etc/mysql/mysql.conf.d/mysqld.cnf
にマウントしています。つまり、コンテナ起動時にMySQLサーバーがmysqld.cnf
ファイルを読み込む際に、ローカルマシン上のmysqld.cnf
ファイルの内容が適用されるようになりました。 - コンテナを再起動後、phpmyadminへインポートするとエラーが消えました。無事に最大パケットサイズが変更されたことが確認できました。