MySQLコマンドやSQL文に関する各種メモ書き

MySQLデータインポート時の「MySQL server has gone away」エラー対処法

MySQLで1GBクラスの大きなデータをインポートする時、デフォルトの設定だと「MySQL server has gone away」が出てしまいます。 そこでメモリの設定を変更しましょう。

公式ドキュメント https://dev.mysql.com/doc/refman/5.6/ja/packet-too-large.html

MySQL 5.6 Server およびクライアント間で転送可能なパケットの最大サイズは 1G バイトです。
クライアントとサーバーの両方にそれぞれ max_allowed_packet 変数があるため、大きなパケットを処理する場合は、クライアントとサーバーの両方のこの変数を増やす必要があります

● max_allowed_packet を確認する

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

4MBに設定されています

● max_allowed_packet を変更する

16M に設定します

vim /etc/my.cnf.d/my.cnf
[mysqld]
max_allowed_packet = 16M

mysqlリスタート

systemctl restart mysql

● max_allowed_packet を変更する(my.cnfが変更できない場合)

mysqlへ接続して直接クエリを流しこみます

set global max_allowed_packet=16777216;

● データインポートを実行する

mysql -u USER-NAME -p DB-NAME --max_allowed_packet=16M < dump.sql

 

これでもエラーが出る場合はそもそも mysqldump のダンプの取り方を変えてみると良いでしょう

● mysqldumpで一行ずつのINSERT文を出力する

mysqldumpではデフォルトで全ての行を1度にINSERTするようなSQL文を吐き出します。
これをやめるオプションが --skip-extended-insert です。これを指定してdumpします。

mysqldump -u USER-NAME -p DB-NAME --skip-extended-insert  > dump.sql

● データの取り込み

mysql -u USER-NAME -p DB-NAME < dump.sql
No.1298
03/06 12:51

edit