すべてのテーブルで構成されるmysqlデータベースのmysqldumpバックアップがあり、約440 MBです。mysqldumpからテーブルの1つだけの内容を復元したい。これは可能ですか?理論的には、必要なテーブルを再構築するセクションを切り取ることもできますが、そのサイズのテキストドキュメントを効果的に編集する方法すらわかりません。
すべてのテーブルで構成されるmysqlデータベースのmysqldumpバックアップがあり、約440 MBです。mysqldumpからテーブルの1つだけの内容を復元したい。これは可能ですか?理論的には、必要なテーブルを再構築するセクションを切り取ることもできますが、そのサイズのテキストドキュメントを効果的に編集する方法すらわかりません。
回答:
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.dump
、テーブルの構造mytable
とデータ(のリストINSERT
)を含むファイルを調整できます。
Table structure for table
、CREATE TABLEで照合するのではなく、コメントで照合する方が便利です。これにより、DROP TABLEステートメントの削除を忘れても次のテーブルが削除されないようになり、単一コマンドのテーブルリストア(gzip | sed | mysql)のパイピングが可能になります。ただし、このソリューションはmysqldumpのコメント構文に依存しています(どの程度標準かわかりません)。
私はuloBasEIのsedコマンドの修正版を使用しました。これには前述のDROPコマンドが含まれており、mysqlがテーブルへのデータのダンプを完了するまで読み取ります(UNLOCK)。私のために働いて、たくさんのWordpressサイトにwp_usersを(再)インポートしました。
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
`mytable`
マッチングテーブルを避けるためにmytable2
ので私の場合にあったように。
sed
エンコーディングを妨げるべきではありません...
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 */;
含まれるような行が含まれるようにします。
これはもっと簡単にできますか?これは私がそれをした方法です:
一時データベースを作成します(例:復元):
mysqladmin -u root -p create restore
一時データベースに完全なダンプを復元します。
mysql -u root -p restore <fulldump.sql
リカバリするテーブルをダンプします。
mysqldumpはmytableを復元します> mytable.sql
別のデータベースにテーブルをインポートします。
mysql -u root -pデータベース<mytable.sql
何らかの方法で、それを行うプロセスは、ダンプのテキスト全体を調べ、何らかの方法でそれを解析する必要があります。私はただグレップします
INSERT INTO `the_table_i_want`
出力をmysqlにパイプします。前にダンプの最初のテーブルを見て、INSERTが正しい方法であることを確認してください。
編集:OK、今回はフォーマットを正しくしました。
@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
このツールはあなたが望むものであるかもしれません: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
これも役立つかもしれません。
# 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'
最近のほとんどのテキストエディタは、システムが限界に達していれば、そのサイズのテキストファイルを処理できるはずです。
とにかく、私はそれを非常に迅速に行う必要があり、ツールを見つける時間がありませんでした。新しいMySQLインスタンスをセットアップし、バックアップ全体をインポートして、必要なテーブルだけを吐き出しました。
次に、そのテーブルをメインデータベースにインポートしました。
退屈でしたが、かなり簡単でした。幸運を。
viエディターを使用できます。タイプ:
vi -o mysql.dump mytable.dump
ダンプ全体mysql.dump
と新しいファイルの両方を開くmytable.dump
。を押して適切な行に挿入を見つけて/
から、たとえば「insert into `mytable`」のようにフレーズを入力し、を使用してその行をコピーしyy
ます。ctrl+w
それまでに次のファイルに切り替えdown arrow key
、コピーした行をで貼り付けますpp
。最後に、入力して新しいファイルを保存し、で:wq
viエディターを保存します:q
。
複数の挿入を使用してデータをダンプした場合は、コピーする行数を使用Nyy
して、それらすべてを一度にコピー(ヤンク)できることに注意してくださいN
。
私はそれを920 MBサイズのファイルで行いました。
Notepad ++やVimなどのまともなテキストエディターを入手します(既に熟練している場合)。テーブル名を検索すると、そのテーブルのCREATE、ALTER、およびINSERTコマンドのみを強調表示できるはずです。マウスを使用するよりもキーボードを使用した方が簡単な場合があります。そして、私はあなたがたくさんのまたはRAMを備えたマシンにいることを確認します、それでそれがファイル全体を一度にロードする問題を持たないでしょう。必要な行を強調表示してコピーしたら、コピーした部分だけを独自のバックアップファイルにバックアップし、それをMySQLにインポートすることをお勧めします。
SQLのチャンクは、「テーブルのテーブル構造my_table
」および「テーブルのデータのダンプ」によってブロックされますmy_table
。
次のようにWindowsコマンドラインを使用して、さまざまなセクションの行番号を取得できます。必要に応じて検索文字列を調整します。
/ n "テーブル` "sql.txtを検索します
以下が返されます:
---------- SQL.TXT
[4384]-テーブルのテーブル構造 my_table
[4500]-テーブルのデータをダンプしています my_table
[4514]-テーブルのテーブル構造 some_other_table
...など
これで必要な行番号が得られます...今、私がそれらの使い方を知っているだけなら...調査中です。
08年に私もこれをする必要がありました。私はそれを行うPerlスクリプトを作成しましたが、これが私の選択した方法です。また、awkでそれを行う方法、または他の場所に復元して抽出する方法もまとめました。最近、このsedメソッドもリストに追加しました。スクリプトと他のメソッドは、http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.htmlで見つけることができます。
信じられないほど遅いいくつかのオプションを試しました。これにより、360GBのダンプが数分でテーブルに分割されます。
前述の「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