MYSQLでダンプしたデータをリストアしようとしたらこのようなコメントが・・・。
ERROR 2013 (HY000) Lost connection to MySQL server during query
よくあることだがぜんぜん理由がわからなくて、突然作業がストップして困る。
結果を先に書いてしまうが、ダンプしたデータを分割してリストアした。分割したおかげでどのテーブルに問題があるのかわかってよかった。
以下ではトライアンドエラーの試行錯誤をメモしておく。
メモリの問題?
まずメモリの問題の可能性が高い様子。INSERT分が長すぎて問題が起こることがあるようだ。そのため以下のようにしてみた。
max_allowed_packet=512M
でも直らない。これだけあってだめならメモリの問題ではないのだろう。
タイムアウト?
5~10分かかる割に結局タイトルのエラーが出ることからタイムアウトがあやしい。
で調べると、クライアントからの待機時間
net_write_timeout
net_read_timeout
が短いとか。
net_write_timeout=6000
net_read_timeout=6000
1時間とかやったけどそれより早くタイトルのエラーになる。
他にも
interactive_timeout(対話型のアクセス時のタイムアウト時間)
wait_timeout(非対話型のアクセス時のタイムアウト時間)
innodb_lock_wait_timeout(ロック待機時間)
とかあっていじってみたけどだめ。
一応一通りチェックのためMYSQLの設定確認
mysql> SHOW GLOBAL STATUS;
mysql> SHOW VARIABLES;
大丈夫そう・・。
ダンプデータ分割
もう理由がわからないので、いっそのことダンプデータからテーブルの一部を持ってこれないか
というアプローチを考えた結果
MySQLのダンプファイルから任意のテーブルのみリストアする
http://qiita.com/toshiro3/items/7844d45076b83103c095
上記ではもっと詳しく書いて歩けど自分のはそれほどでもないので以下を実行
> csplit dumpfile ‘/DROP TABLE IF EXISTS/’ {*}
> mysql -u username -ppassword databasename < xxNNN
すばらしい!これならいっそちょっとrubyとかでスクリプト書いて、一つ一つリストアしてやれば、
フルリストアと同じじゃん!ということでやった。やってやった。
結果としては一つだけ通らないテーブルがあったけど他は全部リストアできた。
ダンプデータってつまりは
テーブルをDROP
テーブルをCRAETE
レコードをINSERT
を羅列しただけなんですね。