it-swarm.com.de

Kann ich eine einzelne Tabelle aus einer vollständigen mysqldump-Datei wiederherstellen?

Ich habe eine mysqldump-Sicherung meiner mysql-Datenbank, die aus allen unseren Tabellen besteht und etwa 440 MB groß ist. Ich möchte nur den Inhalt einer der Tabellen aus dem mysqldump wiederherstellen. Ist das möglich? Theoretisch könnte ich einfach den Abschnitt ausschneiden, der die gewünschte Tabelle neu erstellt, aber ich weiß nicht, wie ich ein Textdokument in dieser Größe effektiv bearbeiten kann.

163
Mobius

Sie können versuchen, sed zu verwenden, um nur die gewünschte Tabelle zu extrahieren.

Angenommen, der Name Ihrer Tabelle ist mytable und die Datei mysql.dump ist die Datei, die Ihren großen Speicherauszug enthält:

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

Dies kopiert in der Datei mytable.dump, was sich zwischen CREATE TABLE mytable und dem nächsten CREATE TABLE befindet, der der nächsten Tabelle entspricht.

Sie können dann die Datei mytable.dump anpassen, die die Struktur der Tabelle mytable und die Daten (eine Liste von INSERT) enthält.

243
uloBasEI

Ich habe eine modifizierte Version des Sed-Befehls von uloBasEI verwendet. Sie enthält den vorangehenden DROP-Befehl und liest, bis mysql Daten in Ihre Tabelle (UNLOCK) gespeichert hat. Arbeitete für mich (re) Import von wp_users in eine Reihe von Wordpress-Sites.

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

Das geht einfacher? So habe ich es gemacht:

Erstellen Sie eine temporäre Datenbank (z. B. Wiederherstellen):

mysqladmin -u root -p create restore

Stellen Sie den vollständigen Speicherauszug in der temporären Datenbank wieder her:

mysql -u root -p restore <fulldump.sql

Legen Sie die Tabelle ab, die Sie wiederherstellen möchten:

mysqldump Wiederherstellen mytable> mytable.sql

Importieren Sie die Tabelle in eine andere Datenbank:

mysql -u root -p Datenbank <mytable.sql

44
Martijn Kools

Eine einfache Lösung wäre, einfach einen Speicherauszug der Tabelle zu erstellen, die Sie separat wiederherstellen möchten. Sie können den Befehl mysqldump dazu mit der folgenden Syntax verwenden:

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

Dann importieren Sie es wie gewohnt, und es wird nur die gedumpte Tabelle importiert.

12
Brom558

Auf die eine oder andere Weise muss jeder Prozess, der dies tut, den gesamten Text des Dumps durchlaufen und ihn auf irgendeine Weise analysieren. Ich würde nur für ...

INSERT INTO `the_table_i_want`

und leiten die Ausgabe in mysql. Werfen Sie einen Blick auf die erste Tabelle im Dump, um sich zu vergewissern, dass Sie die INSERTs richtig einsetzen.

Edit: OK, Formatierung dieses Mal richtig.

8
JCCyC

Sie sollten den Befehl @bryn versuchen, aber ansonsten werden Sie auch die Tabellen mit einem Präfix oder Suffix extrahieren. Dies mache ich normalerweise:

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

Auch zu Testzwecken möchten Sie möglicherweise den Tabellennamen vor dem Importieren ändern:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

Zum Importieren können Sie dann den Befehl mysql verwenden:

mysql -u root -p'password' mydatabase < mytable_restore.sql
7
Maxime Biette
  1. Backup

    $ mysqldump -A | gzip > mysqldump-A.gz
    
  2. Einzelne Tabelle wiederherstellen

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    
6
y.tk

Ein möglicher Weg, um damit umzugehen, ist das Wiederherstellen in einer temporären Datenbank und das Speichern dieser Tabelle aus der temporären Datenbank. Verwenden Sie dann das neue Skript.

4
Tim Hoolihan

Dieses Tool kann das sein, was Sie wollen: tbdba-restore-mysqldump.pl

https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl

z.B. Wiederherstellen einer Tabelle aus der Datenbankspeicherabbilddatei:

tbdba-restore-mysqldump.pl -t Ihre Tabelle -s Ihre DB -f Backup.sql

3
user1097790

Das kann auch helfen.

# 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
pjl

Sie können den vi-Editor verwenden. Art:

vi -o mysql.dump mytable.dump

um den gesamten Dump mysql.dump und eine neue Datei mytable.dump..__ zu öffnen, suchen Sie die entsprechende Einfügung durch Drücken von / und geben Sie dann eine Phrase ein, zum Beispiel: "insert in mytable". Kopieren Sie dann diese Zeile mit yy. Wechseln Sie zur nächsten Datei mit ctrl+w, dann down arrow key, und fügen Sie die kopierte Zeile mit pp ein. Speichern Sie schließlich die neue Datei, indem Sie :wq und den vi-Editor von :q eingeben.

Wenn Sie die Daten mit mehreren Einfügungen gesichert haben, können Sie sie mit Nyy auf einmal kopieren ("yank"), wobei N die Anzahl der zu kopierenden Zeilen ist.

Ich habe es mit einer 920 MB großen Datei gemacht.

1
mtoloo

Die meisten modernen Texteditoren sollten in der Lage sein, eine Textdatei dieser Größe zu verarbeiten, wenn Ihr System dies zulässt.

Jedenfalls musste ich das einmal sehr schnell machen und ich hatte keine Zeit, irgendwelche Werkzeuge zu finden. Ich habe eine neue MySQL-Instanz eingerichtet, das gesamte Backup importiert und dann genau die Tabelle ausgespuckt, die ich wollte.

Dann habe ich diese Tabelle in die Hauptdatenbank importiert.

Es war langweilig, aber ziemlich einfach. Viel Glück.

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

Dies ist eine bessere Lösung als andere, da nicht alle SQL-Dumps eine DROP TABLE-Anweisung enthalten. Dieser wird funktionieren, alle Arten von Dumps.

1
Weston Ganger

Die zuvor genannten "sed" -Lösungen sind Nizza, aber wie erwähnt nicht 100% sicher

  • Möglicherweise haben Sie INSERT-Befehle mit Daten, die Folgendes enthalten: ... CREATE TABLE ... (was auch immer) ... mytable ...

  • oder auch die genaue Zeichenfolge "CREATE TABLE` mytable`; " wenn Sie zum Beispiel DML-Befehle speichern!

(Und wenn der Tisch riesig ist, möchten Sie das nicht manuell überprüfen)

Ich würde die genaue Syntax der verwendeten Dump-Version überprüfen und eine restriktivere Mustersuche durchführen:

Vermeiden Sie ". *" Und verwenden Sie "^", um sicherzustellen, dass wir am Anfang der Zeile beginnen Und ich würde es vorziehen, den anfänglichen "DROP" 

Alles in allem funktioniert das für mich besser:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
0
phil_w

Die SQL-Blöcke werden mit "Tabellenstruktur für Tabelle my_table" und "Daten für Tabelle my_table ausgeben" blockiert.

Sie können eine Windows-Befehlszeile wie folgt verwenden, um die Zeilennummern für die verschiedenen Abschnitte zu erhalten. Passen Sie die gesuchte Zeichenfolge nach Bedarf an.

find/n "für Tabelle` "sql.txt

Folgendes wird zurückgegeben:

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

[4384] - Tabellenstruktur für Tabelle my_table

[4500] - Daten für die Tabelle my_table ausgeben

[4514] - Tabellenstruktur für Tabelle some_other_table

... usw.

Das bringt Ihnen die Zeilennummern, die Sie brauchen ... jetzt, wenn ich nur wusste, wie man sie benutzt ... Nachforschungen.

0
Kuyenda

Die Tabelle sollte in Dump und Datenbank dieselbe Struktur aufweisen.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

oder

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`
0
Neminath

Holen Sie sich einen anständigen Texteditor wie Notepad ++ oder Vim (wenn Sie bereits damit vertraut sind). Suchen Sie nach dem Tabellennamen, und Sie sollten in der Lage sein, nur die Befehle CREATE, ALTER und INSERT für diese Tabelle zu markieren. Es ist möglicherweise einfacher, mit der Tastatur als mit der Maus zu navigieren. Und ich würde sicherstellen, dass Sie auf einer Maschine mit einer Menge oder RAM sind, damit es beim Laden der gesamten Datei nicht zu einem Problem kommt. Wenn Sie die Zeilen, die Sie benötigen, markiert und kopiert haben, empfiehlt es sich, nur den kopierten Teil in einer eigenen Sicherungsdatei zu sichern und anschließend in MySQL zu importieren.

0
Cameron

Ich habe ein paar Optionen ausprobiert, die unglaublich langsam waren. Dadurch wurde ein 360 GB-Dump in wenigen Minuten in seine Tabellen aufgeteilt:

Wie teile ich die Ausgabe von mysqldump in kleinere Dateien auf?

0
Kohjah Breese

In '08 musste ich das auch tun. Ich habe ein Perl-Skript geschrieben, das es tun wird, und es ist jetzt meine Methode der Wahl. Auch zusammengefasst, wie man es in awk macht oder wie man es an anderer Stelle wiederherstellen und extrahieren kann. Kürzlich habe ich diese Sed-Methode auch in die Liste aufgenommen. Das Skript und die anderen Methoden finden Sie hier: http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html

0
JaredC