テーブル - rds mysqldump リストア




mysql.sqlダンプファイルからテーブルを抽出する (4)

私はこの方法で生のmySQLダンプファイルを解析するツールがないことを知っています。

コピーするかコピーするか(厄介な可能性があります)、一時的なデータベースにインポートし、他のすべてをドロップして、テーブルをファイルにダンプします。

私はmysql.sqlファイル内にproductsテーブルを持っています。 その1つのテーブルを抽出して、それをそれ自身のファイルに入れたいと思います。 あなたはこれについてどうやって行きますか?


ダンプが拡張挿入構文で行われた場合、実際の表データはダンプ・ファイル内の1行として処理されます。

INSERT INTO tablename (field, ...) VALUES (data, ...), (data, ...), (etc..)

それは単純にグレープアウトすることができます。 実際のテーブル定義を抽出するのは難しくなりますが、データ行のすぐ上にあるべきです(SHOULD)。 現在のところ適切なシェルにアクセスできないが、頭の上から出ると、このようなものが(擬似コードで)トリックを行うかもしれない:

# retrieve line # that data insertion for the wanted table occurs on
DATALINE=`grep -l 'INSERT INTO tablename' dumpfile.sql`

# limiting ourselves to the part of the file up to the data line, find the line number
# of the last CREATE TABLE, which SHOULD be the one creating the table for the data
CREATELINE=`head -$DATALINE|grep -l 'CREATE TABLE'|tail -1|awk '{"print $1"}'`

わかりやすいhead / tailと取得した行番号を使って作成DDLを抽出することができます:

CREATE=`head -$CREATELINE dumpfile.sql|tail -$($CREATELINE - $DATALINE - 1)`

私はこれについて私の頭の上から出て行くことを覚えておいてください、それはほとんど動作しないことが保証されていますが、あなたを始めさせるのに十分であるはずです。


しばらく前にこの問題に遭遇し、Perlスクリプトを書いた。 うまくいきましたが、MySQLの古いバージョンでした。 それを次のように呼び出す:
extract.pl -table=TABLENAME mysqldumpfile.sql > recovered_table.sql

#!/usr/bin/perl -s -wnl
#extract a single table from a mysql dump
BEGIN {
    $table or warn
    "Usage: $0 -table=TABLE_TO_EXTRACT mysqldumpfile.sql"
    and exit 1;
}

/^DROP TABLE IF EXISTS `$table`/ .. /^UNLOCK TABLES;$/ and print;

あなたが使用できるデータベースを抽出したい場合:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' dumpfile > dbname.sql 2>error

例えば:

sed -n '/^-- Current Database: `blogs`/,/^-- Current Database: `/p' dump.sql > blogs.sql 2>error






scripting