web-dev-qa-db-ja.com

完全なmysql mysqldumpファイルから単一のテーブルを復元できますか?

私のすべてのテーブルで構成されるmysqlデータベースのmysqldumpバックアップは約440メガグラムです。 mysqldumpから1つのテーブルの内容のみを復元したい。これは可能ですか?理論的には、必要なテーブルを再構築するセクションを切り取ることができましたが、そのサイズのテキストドキュメントを効果的に編集する方法すらわかりません。

169
Mobius

Sedを使用して、必要なテーブルのみを抽出することができます。

テーブルの名前がmytableで、ファイルmysql.dumpが巨大なダンプを含むファイルであるとしましょう:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

これにより、mytable.dumpと次のテーブルに対応する次のCREATE TABLE mytableの間にあるファイルCREATE TABLEがコピーされます。

その後、テーブルmytableの構造とデータ(INSERTのリスト)を含むファイルmytable.dumpを調整できます。

253
uloBasEI

UloBasEIのsedコマンドの修正バージョンを使用しました。前のDROPコマンドが含まれ、mysqlがテーブルへのデータのダンプを完了するまで読み取ります(UNLOCK)。 wp_usersを多数のWordpressサイトに(再)インポートしてくれました。

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
99
bryn

これはもっと簡単にできますか?これは私がそれをやった方法です:

一時データベースを作成します(例:復元):

mysqladmin -u root -p create restore

一時データベースに完全なダンプを復元します。

mysql -u root -p restore <fulldump.sql

回復するテーブルをダンプします。

mysqldump restore mytable> mytable.sql

別のデータベースにテーブルをインポートします。

mysql -u root -pデータベース<mytable.sql

45
Martijn Kools

簡単な解決策は、個別に復元するテーブルのみのダンプを作成することです。 mysqldumpコマンドを使用して、次の構文でこれを行うことができます。

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

その後、通常どおりインポートします。ダンプされたテーブルのみがインポートされます。

12
Brom558

何らかの方法で、それを行うプロセスは、ダンプのテキスト全体を調べて、何らかの方法でそれを解析する必要があります。私はただgrepしたい

INSERT INTO `the_table_i_want`

出力をmysqlにパイプします。前にダンプの最初の表を見て、INSERTが正しい方法であることを確認してください。

編集:OK、今度はフォーマットを正しく行いました。

9
JCCyC

@brynコマンドを試す必要がありますが、 `区切り文字を使用すると、プレフィックスまたはサフィックスを持つテーブルも抽出されます。これは私が通常行うことです:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

また、テストのために、インポートする前にテーブル名を変更することもできます。

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

インポートするには、mysqlコマンドを使用できます。

mysql -u root -p'password' mydatabase < mytable_restore.sql
7
Maxime Biette
  1. バックアップ

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. 単一のテーブルを復元する

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
6
y.tk

これに対処する1つの方法は、一時データベースに復元し、一時データベースからそのテーブルだけをダンプすることです。次に、新しいスクリプトを使用します。

4
Tim Hoolihan

このツールはあなたが望むものかもしれません:tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

例えばデータベースダンプファイルからテーブルを復元します。

tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql

3
user1097790

これも役立ちます。

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'
2
Pjl

Viエディターを使用できます。タイプ:

vi -o mysql.dump mytable.dump

ダンプ全体mysql.dumpと新しいファイルmytable.dumpの両方を開きます。 /を押して行への適切な挿入を見つけてから、フレーズを入力します。例えば、「insert into `mytable`」とし、yyを使用してその行をコピーします。 ctrl+w、次にdown arrow keyで次のファイルに切り替え、コピーした行をppで貼り付けます。最後に、:wqと入力し、:qでviエディターと入力して、新しいファイルを保存します。

複数の挿入を使用してデータをダンプした場合は、Nyyを使用してすべてのデータを一度にコピー(ヤンク)できます。ここで、Nはコピーする行数です。

私は920MBのサイズのファイルでそれをやった。

1
mtoloo

テーブルは、ダンプとデータベースの両方で同じ構造で存在する必要があります。

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

または

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
1
Neminath

最新のテキストエディタは、システムが対応していれば、そのサイズのテキストファイルを処理できるはずです。

とにかく、私は一度非常に速くそれをしなければならなかった、そして私はツールを見つける時間を持っていなかった。新しいMySQLインスタンスをセットアップし、バックアップ全体をインポートしてから、必要なテーブルだけを吐き出しました。

次に、そのテーブルをメインデータベースにインポートしました。

それは退屈でしたが、かなり簡単でした。がんばろう。

1
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

すべてのSQLダンプにDROP TABLEステートメントが含まれているわけではないため、これは上記の他のいくつかよりも優れたソリューションです。これは、あらゆる種類のダンプで機能します。

1
Weston Ganger

前述の「sed」ソリューションはニースですが、前述のように100%安全ではありません

  • 次を含むデータを含むINSERTコマンドを使用できます。.. CREATE TABLE ...(whatever)... mytable ...

  • または正確な文字列「CREATE TABLE `mytable`;」たとえば、DMLコマンドを保存している場合!

(テーブルが巨大な場合は、手動でチェックする必要はありません)

使用するダンプバージョンの正確な構文を確認し、より制限的なパターン検索を行います。

「。*」を避け、「^」を使用して、行の先頭から開始するようにします。そして、私は最初の「ドロップ」を手に入れたいです

全体として、これは私にとってより効果的です:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0
phil_w

SQLのチャンクは、「テーブルmy_tableのテーブル構造」および「テーブルmy_tableのデータのダンプ」でブロックされています。

Windowsコマンドラインを次のように使用して、さまざまなセクションの行番号を取得できます。必要に応じて、検索された文字列を調整します。

/ n "for table` "sql.txtを見つけます

以下が返されます。

---------- SQL.TXT

[4384]-テーブルmy_tableのテーブル構造

[4500]-テーブルmy_tableのデータをダンプしています

[4514]-テーブルsome_other_tableのテーブル構造

...など.

これで必要な行番号が得られます...今、私はそれらの使い方を知っていれば...調査しています。

0
Kuyenda

Notepad ++やVimのような適切なテキストエディターを入手します(既に習熟している場合)。テーブル名を検索すると、そのテーブルのCREATE、ALTER、およびINSERTコマンドのみを強調表示できるはずです。マウスよりもキーボードでナビゲートする方が簡単な場合があります。また、ファイル全体を一度にロードする際に問題が発生しないように、十分な数のマシンまたはRAMを使用していることを確認します。必要な行を強調表示してコピーしたら、コピーした部分だけを独自のバックアップファイルにバックアップしてから、MySQLにインポートすることをお勧めします。

0
Cameron

私は信じられないほど遅いいくつかのオプションを試しました。これにより、数分で360GBダンプがテーブルに分割されます。

mysqldumpからの出力を小さなファイルに分割するにはどうすればよいですか?

0
Kohjah Breese

08年に、私もこれを行う必要がありました。それを行うPerlスクリプトを作成しましたが、今ではそれが私の選択の方法です。また、awkでそれを行う方法、または他の場所で復元して抽出する方法もまとめました。最近、このsedメソッドもリストに追加しました。スクリプトと他のメソッドはこちらで見つけることができます: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html =

0
JaredC