Ich habe eine mysqldump-Sicherung meiner mysql-Datenbank, die aus all unseren Tabellen besteht und ungefähr 440 Megabyte groß ist. Ich möchte den Inhalt nur 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 einmal, wie ich ein Textdokument dieser Größe effektiv bearbeiten kann.
194
Antworten:
Sie können versuchen, sed zu verwenden, um nur die gewünschte Tabelle zu extrahieren.
mytable
Angenommen , der Name Ihrer Tabelle lautet und die Datei mysql.dump ist die Datei, die Ihren riesigen Speicherauszug enthält:Dadurch wird in die Datei kopiert,
mytable.dump
was sich zwischenCREATE TABLE mytable
undCREATE TABLE
der nächsten Tabelle befindet, die der nächsten Tabelle entspricht.Sie können dann die Datei anpassen, die
mytable.dump
die Struktur der Tabellemytable
und die Daten (eine Liste vonINSERT
) enthält.quelle
Table structure for table
Kommentaren zu suchen, anstatt nach CREATE TABLE. Dadurch wird sichergestellt, dass die nächste Tabelle nicht gelöscht wird, wenn vergessen wird, die Anweisung DROP TABLE zu entfernen, und Piping für die Wiederherstellung von Tabellen mit nur einem Befehl (gzip | sed | mysql) ermöglicht. Diese Lösung hängt jedoch von der Kommentarsyntax von mysqldump ab (ich weiß nicht, wie Standard sie ist).Ich habe eine modifizierte Version des Befehls sed von uloBasEI verwendet. Es enthält den vorhergehenden DROP-Befehl und liest, bis MySQL fertig ist, um Daten in Ihre Tabelle zu speichern (UNLOCK). Hat für mich (re) importiert wp_users in eine Reihe von Wordpress-Sites.
quelle
`mytable`
zu vermeiden, dass Tabellen übereinstimmen,mytable2
und so weiter, wie es in meinem Fall der Fall war.sed
sollte die Codierung nicht stören ...DROP TABLE
(mein MySQL-Speicherauszug hatte dies nicht), möchten Sie möglicherweisesed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
Folgendes verwenden: Dies verwendet die Tabellenkommentare, die vor jeder Tabelle in einem MySQl-Speicherauszug bereitgestellt werden, und stellt sicher, dass Zeilen wie/*!40101 SET @saved_cs_client = @@character_set_client */;
eingeschlossen werden.Dies kann einfacher gemacht werden? So habe ich es gemacht:
Erstellen Sie eine temporäre Datenbank (z. B. Wiederherstellen):
Stellen Sie den vollständigen Speicherauszug in der temporären Datenbank wieder her:
Speichern Sie die Tabelle, die Sie wiederherstellen möchten:
Importieren Sie die Tabelle in eine andere Datenbank:
quelle
Eine einfache Lösung wäre, einfach einen Speicherauszug nur der Tabelle zu erstellen, die Sie separat wiederherstellen möchten. Sie können den Befehl mysqldump verwenden, um dies mit der folgenden Syntax zu tun:
Importieren Sie es dann wie gewohnt und es wird nur die ausgegebene Tabelle importiert.
quelle
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 danach greifen
und leiten Sie die Ausgabe in MySQL. Schauen Sie sich vorher den ersten Tisch in der Müllkippe an, um sicherzustellen, dass Sie den INSERT richtig einsetzen.
Bearbeiten: OK, diesmal die richtige Formatierung.
quelle
Sie sollten den Befehl @bryn versuchen, aber ansonsten extrahieren Sie mit dem Trennzeichen `` auch die Tabellen mit einem Präfix oder einem Suffix. Dies ist, was ich normalerweise mache:
Zu Testzwecken möchten Sie möglicherweise den Tabellennamen vor dem Import ändern:
Zum Importieren können Sie dann den Befehl mysql verwenden:
quelle
Backup
Stellen Sie eine einzelne Tabelle wieder her
quelle
Eine Möglichkeit, damit umzugehen, besteht darin, eine temporäre Datenbank wiederherzustellen und nur diese Tabelle aus der temporären Datenbank zu sichern. Verwenden Sie dann das neue Skript.
quelle
Dieses Tool ist möglicherweise genau das, was Sie möchten: tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
Beispiel: Wiederherstellen einer Tabelle aus einer Datenbank-Dump-Datei:
quelle
Dies ist eine bessere Lösung als einige der oben genannten, da nicht alle SQL-Dumps eine
DROP TABLE
Anweisung enthalten . Dieser wird funktionieren alle Arten von Dumps.quelle
Dies kann auch helfen.
quelle
Die Tabelle sollte sowohl im Speicherauszug als auch in der Datenbank dieselbe Struktur aufweisen.
oder
quelle
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 nur die gewünschte Tabelle ausgespuckt.
Dann habe ich diese Tabelle in die Hauptdatenbank importiert.
Es war langweilig, aber ziemlich einfach. Viel Glück.
quelle
Sie können den vi-Editor verwenden. Art:
um sowohl den gesamten Speicherauszug
mysql.dump
als auch eine neue Datei zu öffnenmytable.dump
. Suchen Sie die entsprechende Einfügung in eine Zeile, indem Sie drücken,/
und geben Sie dann eine Phrase ein, zum Beispiel: "Einfügen in" mytable "". Kopieren Sie diese Zeile dann mityy
. Wechseln Sie bisctrl+w
dahin zur nächsten Dateidown arrow key
und fügen Sie die kopierte Zeile mit einpp
. Speichern Sie schließlich die neue Datei durch Eingabe:wq
und ganz vi Editor von:q
.Beachten Sie, dass wenn Sie die Daten abgeladen haben mehrere Einsätze verwenden Sie (yank) alle auf einmal mit kopieren ,
Nyy
in demN
die Anzahl der Zeilen kopiert werden.Ich habe es mit einer Datei von 920 MB Größe gemacht.
quelle
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 hervorzuheben. Es ist möglicherweise einfacher, mit der Tastatur als mit der Maus zu navigieren. Und ich würde sicherstellen, dass Sie sich auf einem Computer mit viel RAM befinden, damit es kein Problem gibt, die gesamte Datei auf einmal zu laden. Sobald Sie die benötigten Zeilen markiert und kopiert haben, ist es eine gute Idee, nur den kopierten Teil in einer eigenen Sicherungsdatei zu sichern und ihn dann in MySQL zu importieren.
quelle
Die SQL-Blöcke werden mit "Tabellenstruktur für Tabelle
my_table
" und "Daten für Tabelle sichern" blockiertmy_table
.Sie können eine Windows-Befehlszeile wie folgt verwenden, um die Zeilennummern für die verschiedenen Abschnitte abzurufen. 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 Tabelle sichern
my_table
[4514] - Tabellenstruktur für Tabelle
some_other_table
... etc.
Das bringt dir die Zeilennummern, die du brauchst ... jetzt, wenn ich nur wüsste, wie man sie benutzt ... Nachforschungen.
quelle
In '08 musste ich das auch tun. Ich habe ein Perl-Skript geschrieben, das das erledigt, und jetzt ist es meine Methode der Wahl. Fasst auch zusammen, wie es in awk gemacht wird oder wie man es an anderer Stelle wiederherstellt und extrahiert. Kürzlich habe ich diese sed-Methode auch zur Liste hinzugefügt. 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
quelle
Ich habe ein paar Optionen ausprobiert, die unglaublich langsam waren. Dadurch wurde ein 360-GB-Speicherauszug in wenigen Minuten in seine Tabellen aufgeteilt:
Wie teile ich die Ausgabe von mysqldump in kleinere Dateien auf?
quelle
Die zuvor erwähnten "sed" -Lösungen sind nett, 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 sogar die genaue Zeichenfolge "CREATE TABLE` mytable`; " wenn Sie zum Beispiel DML-Befehle speichern!
(und wenn die Tabelle 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 ersten "DROP" zu nehmen.
Alles in allem funktioniert das besser für mich:
quelle