MySQLの複数DBダンプから特定のDBダンプだけを取り出す方法

mysqldumpを使って全てのデータベースをバックアップしたダンプファイルから特定のデータベースのみを別ファイルに切り出す方法。

–all-databases オプションを指定してダンプを取ると全DBのバックアップが出来ますが、特定のDBのみを復元したい事があります。その時にダンプファイルサイズが50GB、必要なダンプは100MB、という時に全てを復元するのは大変なのです。全ダンプをそのまま復元すると全復元になるので。

特定のDBだけを別ファイルに切り出し個別インポートする方が小回りもききますが、そのためには一手間必要なので手順を解説します。

全てのデータベースをバックアップ

まずは全DBをダンプ。dump_full.sqlに全てを吐き出します。
DB毎に個別ダンプした場合はこのような悩みは発生しませんよ。

$ mysqldump -u ユーザー名 -p --all-databases > dump_full.sql

全てのデータベースを復元

出して入れて、とても簡単な作業です。

$ mysqldump -u ユーザー名 -p < dump_full.sql

全てのDBダンプから特定のDBダンプを切り出す

mysqldumpが吐き出すダンプのフォーマットを元にsedコマンドで必要行のみをdump_single.sqlへ出力。
-n オプションを追加してpフラグを付けると、マッチした行のみが出力されます。

$ sed -n '/^-- Current Database: `切り出すデータベース名`/,/^-- Current Database: `/p' dump_full.sql > dump_single.sql

Mac環境だと上記コマンドを実行すると「sed: RE error: illegal byte sequence」というエラーが出ることがあります。その場合は環境変数に "LC_ALL=C" をセットして実行するとうまく動作します。

$ LC_ALL=C sed -n '/^-- Current Database: `切り出すデータベース名`/,/^-- Current Database: `/p' dump_full.sql > dump_single.sql

1つのDBダンプを復元

DB単位でダンプを取ることが多いと思うのでこの方法はよく使われます。

$ mysqldump -u ユーザー名 -p 復元先DB名 < dump_single.sql

おまけ:テーブル単位で切り出す

1つのDBを切り出したdump_single.sqlから特定のテーブルだけのSQL部分を取得する方法です。

テーブル毎のSQLは「DROP TABLE IF EXISTS `テーブル名`」で始まるので、まずはその行がファイルの何行目にあるのかを一覧で表示します。

$ egrep -in '^drop table if exists' dump_single.sql

12:DROP TABLE IF EXISTS `table_1`;
376:DROP TABLE IF EXISTS `table_2`;
407:DROP TABLE IF EXISTS `table_3`;
439:DROP TABLE IF EXISTS `table_4`;
464:DROP TABLE IF EXISTS `table_5`;

上記の結果の中で先頭にある数字が行数に対応しています。table2 〜 table3 だけのダンプが欲しい!という場合(例えばtable_1のサイズが大きすぎるので復元時に含めないようにしたい時など)はその行数部分だけを切り出します。

$ sed -n '開始行,終了行p' dump_single.sql > dump_table.sql

あとは1つのDBの復元と同じようにDB名を指定して実行すればデータがインポートされます。