すべてのテーブルで構成される約 440 MB の mysql データベースの mysqldump バックアップがあります。mysqldump からテーブルの 1 つのみの内容を復元したいと考えています。これは可能ですか?理論的には、必要なテーブルを再構築するセクションを切り取ることができますが、そのサイズのテキスト ドキュメントを効果的に編集する方法さえ知りません。
20 に答える
sed を使用して、必要なテーブルのみを抽出することができます。
テーブルの名前が次のとおりでmytable
、ファイルmysql.dump
が巨大なダンプを含むファイルであるとします。
$ sed -n -e '/CREATE TABLE.*`mytable`/,/Table structure for table/p' mysql.dump > mytable.dump
これにより、次のテーブルに対応する と次の間mytable.dump
にあるものがファイルにコピーされます。CREATE TABLE mytable
CREATE TABLE
mytable.dump
次に、テーブルの構造mytable
とデータ (のリスト) を含むファイルを調整できますINSERT
。
uloBaseEI の sed コマンドの修正版を使用しました。これには前述の DROP コマンドが含まれており、mysql がテーブルへのデータのダンプ (UNLOCK) を完了するまで読み取ります。たくさんのWordpressサイトにwp_usersを(再)インポートするのに役立ちました。
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
これはもっと簡単にできますか?これが私がやった方法です:
一時データベースを作成します (復元など):
mysqladmin -u root -p 作成 復元
一時データベースにフル ダンプを復元します。
mysql -u root -p 復元 < fulldump.sql
回復したいテーブルをダンプします。
mysqldump 復元 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
これに対処する 1 つの可能な方法は、一時データベースに復元し、一時データベースからそのテーブルだけをダンプすることです。次に、新しいスクリプトを使用します。
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
すべての SQL ダンプにステートメントが含まれているわけではないため、これは上記の他のソリューションよりも優れたソリューションですDROP TABLE
。これはあらゆる種類のダンプで機能します。
このツールが必要な場合があります: 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
最新のテキスト エディタのほとんどは、システムが対応している場合、そのサイズのテキスト ファイルを処理できるはずです。
とにかく、私はそれを非常に迅速に行う必要があり、ツールを見つける時間がありませんでした. 新しい MySQL インスタンスをセットアップし、バックアップ全体をインポートしてから、必要なテーブルだけを吐き出しました。
次に、そのテーブルをメイン データベースにインポートしました。
面倒でしたが、かなり簡単でした。幸運を。
いくつかのオプションを試しましたが、信じられないほど遅かったです。これにより、360GB のダンプが数分でテーブルに分割されます。
前述の「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
SQL のチャンクは、「テーブルのテーブル構造my_table
」と「テーブルのデータのダンプ」でブロックされますmy_table
。
次のように Windows コマンド ラインを使用して、さまざまなセクションの行番号を取得できます。必要に応じて検索文字列を調整します。
find /n "for table `" sql.txt
以下が返されます。
---------- SQL.TXT
[4384]-- テーブルのテーブル構造my_table
[4500]-- テーブルのデータをダンプしていますmy_table
[4514]-- テーブルのテーブル構造some_other_table
...など
これで必要な行番号が得られます...今、それらの使用方法さえ知っていれば...調査中です。
Notepad++ や Vim などの適切なテキスト エディターを入手してください (既に習熟している場合)。テーブル名を検索すると、そのテーブルの CREATE、ALTER、および INSERT コマンドだけを強調表示できるはずです。マウスよりもキーボードの方が操作しやすいかもしれません。また、ファイル全体を一度にロードする際に問題が発生しないように、十分な RAM を備えたマシンを使用していることを確認します。必要な行を強調表示してコピーしたら、コピーした部分だけを独自のバックアップ ファイルにバックアップしてから、MySQL にインポートすることをお勧めします。
sed
私はここでいくつかの創意工夫を賞賛しますが、OPの質問に対処するために使用する理由は文字通りまったくありません.
コメント「use --one-database」は正解で、MySQL/MariaDB に組み込まれています。サードパーティのハッキングは必要ありません。
mysql -u root -p databasename --one-database < localhost.sql
目的のデータベースをインポートするだけです。
また、場合によっては、これを使用して一連のデータベースをインポートすると、リストに次のデータベースが作成されます (ただし、何も入力されません)。なぜそうしたのかはわかりませんが、復元が簡単になりました。
このコマンドでパスワードを対話的に入力すると、要求されたデータベースがインポートされます。