先日、WordPressで作成したサイトのサーバ移設作業をしていたのですが、mysqldumpで作成したダンプファイルを移設先サーバのMySQLにロードしようとしたところ、「Got a packet bigger than ‘max_allowed_packet’ bytes」というエラーが出ました。
解決策を調べたところ、MySQLサーバの「max_allowed_packet」という値を変更する方法が見つかったのですが、今回その方法は使えませんでした。mysqldumpで生成したダンプファイルのエラーになった箇所を調べたところ、大きいテーブルのすべてのレコードをひとつの「INSERT INTO」文によって挿入するようになっていたため、この文のサイズが「max_allowed_packet」を超えているのがエラーの原因であることがわかりました。
そこで、mysqldumpでダンプファイルを生成するときに、レコード毎のINSERT文にする方法を調べました。具体的には、
1 |
INSERT INTO `table1` VALUES (1,'aaa'),(2,'bbb'),(3,'ccc'); |
のように生成されるのを、
1 2 3 |
INSERT INTO `table1` VALUES (1,'aaa'); INSERT INTO `table1` VALUES (2,'bbb'); INSERT INTO `table1` VALUES (3,'ccc'); |
のように生成されるようにする方法です。
その方法ですが、mysqldumpを実行するときに、「--skip-extended-insert
」というオプションを付けるだけです。例えば、以下のように実行します。
1 |
$ mysqldump -u user1 -p --skip-extended-insert wp_db1 > wp_db1_dump.sql |
このように生成したダンプファイルの難点は、ロードするのに時間がかかることですが、場面により、適宜使っていこうと思います。