mysqldumpと「Got a packet bigger than 'max_allowed_packet' bytes」

そこそこ巨大なテーブルをmysqldumpで書き出して、nkfでEUC-JPからUTF-8に変換、テーブルの照会順序もutf8-generic-ciにして書き戻す、ということをやろうとした。

サーバのMySQLのバージョンは4.1。

$ mysqldump –version
mysqldump  Ver 10.9 Distrib 4.1.20, for redhat-linux-gnu (i386)

$ mysqldump -u root -h localhost -p –complete-insert –quick –no-create-info データベース名 > datas.sql
$ nkf -Ew datas.sql > datas.utf8.sql
$ mysql -u root -h localhost -p データベース名 < datas.utf8.sql

こんな感じで実行してみたらタイトルにある”Got a packet bigger than ‘max_allowed_packet’ bytes”のエラーが発生。

SQLファイルの中身を見ると拡張INSERT文がずらーっと。しかも何かnkfが所々で文字化けを起こしてるし。

MySQLのバックアップデータをUTF8で復元する – Knowledge Database IT

–max_allowed_packet=128M のオプションとかはなぜか効かず。まぁ、効かないことが多いようですが。

Linuxでやる夫: [mysql] やる夫がmax_allowed_packetの設定をするようです。

mysqlコマンドでログインしてから「source ファイル名」でも取りこめるのですが、ちょっと面倒なので、拡張INSERTを何とかやめたい。

メモ: mysqldumpで一行ずつのINSERT

MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.9.7 mysqldump(テーブル構造とデータのダンプ)

MySQL4.1のmysqldumpのマニュアルには–skip-系のオプションの記述がなかったのですが、MySQL5.1のマニュアルを見たら発見。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム

使えるのかなーと思って試してみたところ成功。

$ mysqldump -u root -h localhost -p –complete-insert  –skip-extended-insert –quick –no-create-info データベース名 > datas.sql
$ nkf -Ew datas.sql > datas.utf8.sql
$ mysql -u root -h localhost -p データベース名 < datas.utf8.sql

nkfの文字化けも直ったしこれで解決。


新しく会社作りました!

コメントをどうぞ