インソースマーケティングデザイン
2016.07.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クエリを分割できるものに限定されます。
あくまで一例ということで説明させていただきたいと思います。