概要
- 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へインポートするとエラーが消えました。無事に最大パケットサイズが変更されたことが確認できました。