背景
運営サービスを開発環境にリストアする際に、特定のテーブルデータは不要であり、dumpファイルを直接編集して不要箇所を削除することにしました。
だいたいdumpデータ自体は10GB程度で、流石にエディタで開くのは厳しい量です。
削除行数の特定
先述したように通常のエディタで開くのは厳しいので、
直接ファイル内を検索し、不要箇所の行数を特定するアプローチでトライしました。
egrep -n '^DROP TABLE IF EXISTS `target_table_name`' dump.sql
...待つことしばらく...
12944:DROP TABLE IF EX...
みたいな感じで行数が特定できました。
そこでいったん扱いやすいファイルに変換します。
sed -n '12944,14000p' dump.sql > temp.sql
そのまま target_table_name に関連する内容だけ削除したいので、次のテーブル情報がどこに出てくるか検索します。
egrep -n '^DROP TABLE IF EXISTS' dump.sql
......待つこと多少の時間......
1:DROP TABLE IF EXISTS `target_table_name`;
53:DROP TABLE IF EXISTS `next_table_name`;
121:DROP TABLE IF EXISTS `2next_table_name`;
みたいに行数がわかるので今回で言えば、
12944行目から
12996(=12944+53-1)行目分を
削除すれば良いとわかりました。
特定行が削除されたdumpファイル生成
ここまで行ったらあとは削除すればOK
ただ削除時によく使うsedはそのコマンドだけだと、延々と標準出力にdumpファイルが書き出されることになるので、ファイル生成にしてあげましょう
sed -e '12944,12996d' dump.sql > deleted_dump.sql
以上で、完了です。お疲れ様でした。
参考