カテゴリー
未分類

巨大なMySQLのダンプファイルをテーブル毎に分割する

100GBとか無駄にデータの入った巨大なファイルから必要なテーブルを救出したいとな。

取り出すのに一旦ファイルを開いたりしたらそれだけでメモリ死にますな。vimみたいなので開いても、必要なテーブルの行までどう行くのか。エスパーで行数がわかれば 行数 G でいけますが、あんまり現実的ではないです。

csplitでテーブル毎に分割する

下記の行で分割すれば実質テーブル毎に分割となる

csplit big.sql '/DROP TABLE IF EXISTS/' '{*}'

するとこんな風にファイルが分割される

$ ls
xx00 xx01 xx02

どのファイルがどのテーブルか調べる

いちいち開いて確認してたらテーブルが1000個とか合った時に死ぬので、全ファイルの先頭1行を取り出して中身をチェックすれば目的のテーブルがわかる。

$ head -n 1 `find ./ -name 'xx*'`
==> ./xx00 <==
DROP TABLE IF EXISTS `a`;

==> ./xx01 <==
DROP TABLE IF EXISTS `b`;

==> ./xx02 <==
DROP TABLE IF EXISTS `c`;

1000ファイル分の結果を目で追うとこれまた死ぬので、ファイルに出力してvimとかで検索するとすぐ終わりそう。

参考

https://qiita.com/toshiro3/items/7844d45076b83103c095

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA