私のすべてのテーブルで構成されるmysqlデータベースのmysqldumpバックアップは約440メガグラムです。 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
の構造とデータ(INSERT
のリスト)を含むファイルmytable.dump
を調整できます。
UloBasEIのsedコマンドの修正バージョンを使用しました。前のDROPコマンドが含まれ、mysqlがテーブルへのデータのダンプを完了するまで読み取ります(UNLOCK)。 wp_usersを多数のWordpressサイトに(再)インポートしてくれました。
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
これはもっと簡単にできますか?これは私がそれをやった方法です:
一時データベースを作成します(例:復元):
mysqladmin -u root -p create restore
一時データベースに完全なダンプを復元します。
mysql -u root -p restore <fulldump.sql
回復するテーブルをダンプします。
mysqldump restore mytable> mytable.sql
別のデータベースにテーブルをインポートします。
mysql -u root -pデータベース<mytable.sql
簡単な解決策は、個別に復元するテーブルのみのダンプを作成することです。 mysqldumpコマンドを使用して、次の構文でこれを行うことができます。
mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
その後、通常どおりインポートします。ダンプされたテーブルのみがインポートされます。
何らかの方法で、それを行うプロセスは、ダンプのテキスト全体を調べて、何らかの方法でそれを解析する必要があります。私はただgrepしたい
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
バックアップ
$ mysqldump -A | gzip > mysqldump-A.gz
単一のテーブルを復元する
$ mysql -e "truncate TABLE_NAME" DB_NAME
$ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
これに対処する1つの方法は、一時データベースに復元し、一時データベースからそのテーブルだけをダンプすることです。次に、新しいスクリプトを使用します。
このツールはあなたが望むものかもしれません: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'
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のサイズのファイルでそれをやった。
テーブルは、ダンプとデータベースの両方で同じ構造で存在する必要があります。
`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`
最新のテキストエディタは、システムが対応していれば、そのサイズのテキストファイルを処理できるはずです。
とにかく、私は一度非常に速くそれをしなければならなかった、そして私はツールを見つける時間を持っていなかった。新しいMySQLインスタンスをセットアップし、バックアップ全体をインポートしてから、必要なテーブルだけを吐き出しました。
次に、そのテーブルをメインデータベースにインポートしました。
それは退屈でしたが、かなり簡単でした。がんばろう。
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
すべてのSQLダンプにDROP TABLE
ステートメントが含まれているわけではないため、これは上記の他のいくつかよりも優れたソリューションです。これは、あらゆる種類のダンプで機能します。
前述の「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
SQLのチャンクは、「テーブルmy_table
のテーブル構造」および「テーブルmy_table
のデータのダンプ」でブロックされています。
Windowsコマンドラインを次のように使用して、さまざまなセクションの行番号を取得できます。必要に応じて、検索された文字列を調整します。
/ n "for table` "sql.txtを見つけます
以下が返されます。
---------- SQL.TXT
[4384]-テーブルmy_table
のテーブル構造
[4500]-テーブルmy_table
のデータをダンプしています
[4514]-テーブルsome_other_table
のテーブル構造
...など.
これで必要な行番号が得られます...今、私はそれらの使い方を知っていれば...調査しています。
Notepad ++やVimのような適切なテキストエディターを入手します(既に習熟している場合)。テーブル名を検索すると、そのテーブルのCREATE、ALTER、およびINSERTコマンドのみを強調表示できるはずです。マウスよりもキーボードでナビゲートする方が簡単な場合があります。また、ファイル全体を一度にロードする際に問題が発生しないように、十分な数のマシンまたはRAMを使用していることを確認します。必要な行を強調表示してコピーしたら、コピーした部分だけを独自のバックアップファイルにバックアップしてから、MySQLにインポートすることをお勧めします。
私は信じられないほど遅いいくつかのオプションを試しました。これにより、数分で360GBダンプがテーブルに分割されます。
08年に、私もこれを行う必要がありました。それを行うPerlスクリプトを作成しましたが、今ではそれが私の選択の方法です。また、awkでそれを行う方法、または他の場所で復元して抽出する方法もまとめました。最近、このsedメソッドもリストに追加しました。スクリプトと他のメソッドはこちらで見つけることができます: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html =