mysqlダンプデータからテーブルごとに切り出したダンプデータを作成する
切り出しファイルの行数を算出
まずgrepを使用してmysqlのダンプデータからテーブルごとのDDLからDMLまでの行数を抜き出します。
1 2 3 4 5 6 7 8 9 10 |
$ egrep -in '^drop table if exists' ./all.dump 22:DROP TABLE IF EXISTS `tbl_a`; 61:DROP TABLE IF EXISTS `tbl_b`; 126:DROP TABLE IF EXISTS `tbl_c`; 158:DROP TABLE IF EXISTS `tbl_d`; ... 1562:DROP TABLE IF EXISTS `tbl_h`; 2942:DROP TABLE IF EXISTS `tbl_i`; ... |
ファイル切り出し
tbl_hのdumpファイルを切り出したいとき、
1562行目から次のDROP分の1行前の2941行目を切り出せばできます。
このとき、
1 2 |
sed -n '1562,2941p' all.dump > tbl_h.dump |
とすれば1562行目から2941行目のdumpファイルが作成できるのですが、ファイルが大きいとCPU使用率が高く、なおかつ時間がかかります。
高速ファイル切り出し
1 2 |
head -n 2941 all.dump | tail -n 1380 > tbl_h.dump |
(2941 – 1562 + 1 = 1380)
とすると高速化され、なおかつCPU使用率も高くありません。
高速ファイル切り出しのシェル登録
ただ、headを使用すると切り出す行が何行あるかの計算をしなくてはならないので面倒です。
そんなときは、
1 2 3 4 5 |
function cut_line { head -n $3 $1 | tail -n $(($3 - $2 + 1)) } alias mid='\cut_line' |
を.zshrcなどに登録しておくことで
1 2 |
mid all.dump 5 7 > out.dump |
とすれば、5行目から7行目の3行分が切り出せます。