system
マリンロード

2016.7.20システム開発 

マリンロード

MySQLのダンプ復元でmax_allowed_packetでハマった話

マネージドサーバーなどでmy.cnfによりmax_allowed_packetが設定できない場合で、mysqlにGot a packet bigger than ‘max_allowed_packet’ bytesと言われた時の対策例になります。

通常の方法

・バックアップ取得
mysqldump -uユーザ名 -pパスワード DB名 > ~/sqlspace/database.dmp

・バックアップ復元
mysql -uユーザ名 -pパスワード DB名 < ~/sqlspace/database.dmp

とやる必要があります。

この時、マネージドサーバーなどでmy.cnfを触ることを許されていない環境で
max_allowed_packetが1Mなどになっている場合、ダンプを戻そうとすると

ERROR 1153 (08S01) at line XXX: Got a packet bigger than ‘max_allowed_packet’ bytes

と、言われてしまいます。

設定を変更せずにダンプを戻そうと必死に情報を探しましたが
なかなか情報に行き着かず・・・
そこで、そもそもですが
mysqldumpのデフォルトでは高速化のために1クエリで大量のINSERTを投げる仕様になっていることを思い出し
それを切ればいいと思い実践してみました。

対策をした場合

・バックアップ取得
mysqldump -uユーザ名 -pパスワード -c –skip-extended-insert DB名 > ~/sqlspace/database.dmp

・バックアップ復元
mysql -uユーザ名 -pパスワード DB名 < ~/sqlspace/database.dmp

すごく時間がかかります!!(この時は20分くらい)
ちなみに出力サイズが2倍以上になります。
ただし、画像などのバイナリデータが含まれていてオーバーする場合は無理かもしれません。
あくまでもINSERTクエリを分割できるものに限定されます。
あくまで一例ということで説明させていただきたいと思います。

現役ウェブ解析士が教えるWebサイトの読み解き方 イメージ
システム開発サービスはこちら
ページTOPへ