219

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

4

20 に答える 20

318

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

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

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

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

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

于 2009-06-18T17:10:27.190 に答える
143

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

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
于 2013-04-07T01:11:32.787 に答える
55

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

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

mysqladmin -u root -p 作成 復元

一時データベースにフル ダンプを復元します。

mysql -u root -p 復元 < fulldump.sql

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

mysqldump 復元 mytable > mytable.sql

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

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

于 2013-04-25T12:33:35.593 に答える
13

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

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

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

于 2013-08-08T09:34:24.047 に答える
9

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

INSERT INTO `the_table_i_want`

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

編集:OK、今度はフォーマットが正しくなりました。

于 2009-06-18T16:57:00.700 に答える
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
于 2013-09-18T12:40:00.760 に答える
4

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

于 2009-06-18T16:57:48.610 に答える
4
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

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

于 2016-07-12T16:59:22.197 に答える
3

このツールが必要な場合があります: 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

于 2011-12-14T12:41:20.830 に答える
1

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

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

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

面倒でしたが、かなり簡単でした。幸運を。

于 2009-06-18T16:58:53.240 に答える
1

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

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

于 2016-04-22T14:55:48.583 に答える
1

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

  • 以下を含むデータを含む INSERT コマンドがある場合があります。 ... CREATE TABLE...(何でも)...mytable...

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

(テーブルが巨大な場合は、手動でチェックしたくありません)

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

「.*」を避け、「^」を使用して、行頭から開始するようにします。そして、最初の「DROP」を取得したいと思います

全体として、これは私にとってはうまく機能します:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
于 2014-07-31T18:38:41.563 に答える
0

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

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

find /n "for table `" sql.txt

以下が返されます。

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

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

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

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

...など

これで必要な行番号が得られます...今、それらの使用方法さえ知っていれば...調査中です。

于 2009-06-18T18:24:02.443 に答える
0

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

于 2009-06-18T17:04:42.843 に答える
-3

sed私はここでいくつかの創意工夫を賞賛しますが、OPの質問に対処するために使用する理由は文字通りまったくありません.

コメント「use --one-database」は正解で、MySQL/MariaDB に組み込まれています。サードパーティのハッキングは必要ありません。

mysql -u root -p databasename --one-database < localhost.sql目的のデータベースをインポートするだけです。

また、場合によっては、これを使用して一連のデータベースをインポートすると、リストに次のデータベースが作成されます (ただし、何も入力されません)。なぜそうしたのかはわかりませんが、復元が簡単になりました。

このコマンドでパスワードを対話的に入力すると、要求されたデータベースがインポートされます。

于 2021-06-19T12:01:39.187 に答える