常日頃、保守業務で問合せ対応を行っていると、過去のダンプファイルから任意のテーブルのみリストアしたい場合がよく発生します。
今回は備忘録としてその手順をまとめておこうと思います。
まず初めに、zegrepコマンドを使ってダンプファイルに格納されているテーブルの開始行番号を取得します。
構文は以下の通りです。
zegrep -in ‘^drop table if exists’ [対象のダンプファイル] |
このコマンドを実行すると、指定したダンプファイルの各テーブルの先頭の行番号の一覧が表示されます。
22:DROP TABLE IF EXISTS `TBL-A`; 222:DROP TABLE IF EXISTS `TBL-B`; 268:DROP TABLE IF EXISTS `TBL-C`; 312:DROP TABLE IF EXISTS `TBL-D`; 413:DROP TABLE IF EXISTS `TBL-E`; |
この一覧でリストアしたいテーブルの開始行番号を確認しておきます。
次に、zcatコマンドとsedコマンドを組合わせて、対象のダンプファイルから任意のテーブルのデータブロックを抜き出します。
構文は以下の通りです。
zcat [対象のダンプファイル] | sed -n ‘[開始行],[終了行]p’ > [出力するファイル] |
今回はTBL-Cを抜き出す想定で記述すると、
zcat [対象のダンプファイル] | sed -n ‘268,311p’ > 20240817_TBL-C.dmp |
となります。
ここで注意する点は、終了行は次のテーブル(TBL-D)の開始行から-1した値になるということです。
ここまでくれば、単純に出力ファイルをリストアしたいスキーマーへ取り込めば、任意のテーブルのみリストアすることが可能です。
今回は対象のダンプファイルがgzipで圧縮されている前提でコマンドを紹介しましたが、圧縮されていない場合は、それぞれegrepコマンド、catコマンドを使用すると同様に抽出が可能です。