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


194

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


2
FWIW、mydumperを使用することもできます。これはmysqldumpのような論理ダンプを作成しますが、テーブルごとに個別のファイルを出力し、マルチスレッドのダンプとロードの両方を実行できるため、時間がかかりません。
Bill Karwin 2014年

回答:


289

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

テーブルの名前がmytableで、ファイルmysql.dumpが巨大なダンプを含むファイルだとします。

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

これは、次のテーブルに対応する次の間にmytable.dumpあるものをファイルにコピーします。CREATE TABLE mytableCREATE TABLE

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


5
これはCREATE TABLEも処理するため、私の回答よりも優れていますが、「thisismytabletoo」という別のテーブルを取得しないように、バッククォートで検索する必要があります。
JCCyC 2009年

1
そうだね。すべてのmysqlダンプのテーブル名が常に逆引用符で囲まれているかどうか、または「CREATE TABLE mytable」も可能かどうかはわかりませんでした。ダンプがどのように見えるかを知っていれば、最初の正規表現を簡単に適合させることができます。2番目の問題は、テーブルmytableが一意でない場合です(1つはデータベースdb1にあり、もう1つはデータベースdb2にあります)。両方ともファイルmytable.dumpにエクスポートされます。テーブルが一意でない場合は、最初にCREATE DATABASEを使用して同じsedコマンドを使用し、適切なデータベースのみを抽出できます。次に、CREATE TABLEでsedコマンドを使用します。
uloBasEI 2009年

13
甘い!上部にDROP TABLEを追加し、ファイルの下部にあるDROP TABLE [次のテーブル]を削除することを忘れないでください。
ネイサン

20
DROP TABLEを追加/削除しない場合はTable structure for table、CREATE TABLEで照合するのではなく、コメントで照合する方が便利です。これにより、DROP TABLEステートメントの削除を忘れても次のテーブルが削除されないようになり、単一コマンドのテーブルリストア(gzip | sed | mysql)のパイピングが可能になります。ただし、このソリューションはmysqldumpのコメント構文に依存しています(どの程度標準かわかりません)。
Olexa 2013

12
Olexaの変更で、それは完璧です:sedの-n -e '/テーブル構造用* `mytableは/、/テーブル構造用/ P' whole.sql> mytable.sql
deeenes

120

私はuloBasEIのsedコマンドの修正版を使用しました。これには前述のDROPコマンドが含まれており、mysqlがテーブルへのデータのダンプを完了するまで読み取ります(UNLOCK)。私のために働いて、たくさんのWordpressサイトにwp_usersを(再)インポートしました。

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

3
これは実際、上記の回答として選択されたものよりもはるかに優れたソリューションです。賛成票が増えなかったなんて信じられません。
rICh 2013年

9
:私は、テーブル名に少なくともバッククォート引用符で追加することをお勧め`mytable`マッチングテーブルを避けるためにmytable2ので私の場合にあったように。
bartekbrak 14

3
あなたは私のお尻を保存しました
ガブリエルアラック

1
@ user706420うーん、端末のせいではなかったと思いますか?sedエンコーディングを妨げるべきではありません...
bryn

6
DROP TABLE(MySQLダンプにこれが含まれていなかった)SQLファイルが含まれていない場合は、次を使用できます。sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql これは、MySQlダンプ内の各テーブルの前に提供されたテーブルコメントを利用し、/*!40101 SET @saved_cs_client = @@character_set_client */;含まれるような行が含まれるようにします。
hamx0r

50

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

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

mysqladmin -u root -p create restore

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

mysql -u root -p restore <fulldump.sql

リカバリするテーブルをダンプします。

mysqldumpはmytableを復元します> mytable.sql

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

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


2
これはほとんどの人が必要とするものです。
sjas 2015

2
この編集提案によれば、「- one -database」パラメータを追加して、1つのデータベースのみを復元し、他のすべてを破壊しないようにする必要があります。
SLバース-モニカを2015年

7
本当に巨大なデータベースの場合、それは非常に奇妙なことです-100 MBの1つのテーブルに対して150 GBのデータを復元します。
Enyby 2016

私はこれを "--one-database"なしで実行しましたが、それでもテーブルをうまくマージしました。既存のテーブルは削除されませんでした。
カシム

1
とても悪い習慣です!ダンプにいくつかのDBがあり、1つだけを復元しようとして、他のすべてを削除しました。
AndreyP 16

11

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

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

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


9

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

INSERT INTO `the_table_i_want`

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

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


私はすぐにそれをぐちゃぐちゃにしようと思っていないのでばかです。Grepは私のベーコンを毎日保存しているようです。他の2つの提案も前向きなものであり、grepの不思議がなければ、私は完全に私が何をしたでしょう。皆さん、ありがとうございました!
メビウス

6
あなたがgrepを愛していると思うなら、あなたがawkを学ぶとき、あなたはその幸せな性奴隷になるでしょう:en.wikipedia.org/wiki/Awk
JCCyC

7

@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

6
  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

4

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



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

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


2

これも役立つかもしれません。

# 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

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

`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

最近のほとんどのテキストエディタは、システムが限界に達していれば、そのサイズのテキストファイルを処理できるはずです。

とにかく、私はそれを非常に迅速に行う必要があり、ツールを見つける時間がありませんでした。新しいMySQLインスタンスをセットアップし、バックアップ全体をインポートして、必要なテーブルだけを吐き出しました。

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

退屈でしたが、かなり簡単でした。幸運を。


1

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

vi -o mysql.dump mytable.dump

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

複数の挿入を使用してデータをダンプした場合は、コピーする行数を使用Nyyして、それらすべてを一度にコピー(ヤンク)できることに注意してくださいN

私はそれを920 MBサイズのファイルで行いました。


0

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


1
これは実際にはとても簡単で、初心者でも理解できます。なぜこれが反対投票されたのか、私にはわかりません。
Karl Johan Vallner、2017年

0

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

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

/ n "テーブル` "sql.txtを検索します

以下が返されます:

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

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

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

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

...など

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


0

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



0

前述の「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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.