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

StackOverflow https://stackoverflow.com/questions/1013852

Frage

Ich habe eine mysqldump Backup meiner MySQL-Datenbank aller unserer Tabellen besteht, die etwa 440 MB ist. Ich möchte den Inhalt von nur einem der Tische die mysqldump bilden wiederherzustellen. Ist das möglich? Theoretisch könnte ich ausgeschnitten nur den Abschnitt, der die Tabelle neu erstellt ich will, aber ich weiß nicht einmal, wie effektiv diese Größe ein Textdokument bearbeiten.

War es hilfreich?

Lösung

Sie können versuchen, sed zu verwenden, um nur die Tabelle, die Sie extrahieren möchten.

Lassen Sie sagen, der Name Ihrer Tabelle ist mytable und die Datei mysql.dump ist die Datei Ihre großen Dump enthält:

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

Dies wird in der Datei mytable.dump kopieren, was zwischen CREATE TABLE mytable und dem nächsten CREATE TABLE entsprechend der folgenden Tabelle befindet.

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

Andere Tipps

Ich habe eine modifizierte Version von uloBasEI des sed-Befehl. Es umfasst den vorhergehenden Befehl DROP und liest bis mysql Dumping Daten auf den Tisch (UNLOCK) durchgeführt wird. Arbeitet für mich (wieder) zu importieren wp_users zu einem Bündel von Wordpress-Site.

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

Dies kann leichter getan werden? Dies ist, wie ich tat es:

Erstellen Sie eine temporäre Datenbank (zum Beispiel Wiederherstellung):

  

mysqladmin -u root -p wiederherstellen erstellen

Wiederherstellen der vollständige Dump in der temporären Datenbank:

  

mysql -u root -p wiederherstellen

Dump der Tabelle möchten Sie wiederherstellen:

  

mysqldump wiederherstellen Mytable> mytable.sql

Importieren Sie die Tabelle in einer anderen Datenbank:

  

mysql -u root -p Datenbank

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

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

Dann ist es normal importieren, und es wird die gespeicherte Tabelle nur importiert werden.

So oder so, jeder Prozess, das zu tun hat durch den gesamten Text der Halde gehen und es in irgendeiner Art und Weise zu analysieren. Ich würde nur grep für

INSERT INTO `the_table_i_want`

und Rohr der Ausgabe in mysql. Werfen Sie einen Blick auf die erste Tabelle in der Deponie vor, um sicherzustellen, dass Sie bekommen die den richtigen Weg des INSERT.

Edit: OK., Bekam die Formatierung dieses Mal richtig

Sie sollten @bryn Befehl versuchen, aber mit dem `Begrenzer sonst werden Sie extrahieren auch die Tabellen einen Präfix mit oder einem Suffix, das ist, was ich in der Regel tun:

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

Auch für Testzwecke, sollten Sie vor dem Import der Tabellennamen ändern:

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

So importieren Sie können dann den mysql-Befehl verwenden:

mysql -u root -p'password' mydatabase < mytable_restore.sql
  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
    

Eine Möglichkeit, dieses zu beschäftigen ist in eine temporäre Datenbank wiederherzustellen, und Dump nur die Tabelle aus der temporären Datenbank. Dann das neue Skript verwenden.

Dieses Werkzeug sein kann, ist, was Sie wollen: tbdba-restore-mysqldump.pl

https://github.com/orczhou/ dba-Werkzeug / Blob / Master / tbdba-restore-mysqldump.pl

z. Wiederherstellen einer Tabelle aus der Datenbank-Dump-Datei:

  

tbdba-restore-mysqldump.pl -t yourtable es ihredb -f backup.sql

Dies 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'

Die meisten modernen Texteditoren Lage sein sollte, einen Text zu handhaben, dass die Größe der Datei, wenn Ihr System bis zu es ist.

Wie auch immer, hatte ich sehr schnell, dass einmal zu tun und ich habe nicht Zeit, um alle Tools zu finden habe. Ich habe eine neue MySQL-Instanz, importiert die gesamte Backup-und spucken dann aus nur den Tisch ich wollte.

Dann importierte ich die Tabelle in der Hauptdatenbank.

Es war mühsam, aber recht einfach. Viel Glück.

Sie können vi-Editor verwenden. Typ:

vi -o mysql.dump mytable.dump

sowohl öffnen ganze Dump mysql.dump und eine neue Datei mytable.dump. Suchen Sie die entsprechende Einlage in der Leitung durch / drücken und dann eine Phrase eingeben, zum Beispiel: „insert into` mytable`“, kopieren Sie diese Zeile yy verwenden. Wechseln Sie in der nächsten Datei von ctrl+w dann down arrow key, fügen Sie die kopierte Zeile mit pp. speichert schließlich die neue Datei von :wq und ganz vi-Editor von :q eingeben.

Beachten Sie, wenn Sie die Daten abgeladen haben mehrere Einsätze verwenden, können Sie (yank) alle von ihnen auf einmal kopieren Nyy verwendet, bei dem N die Anzahl der Zeilen kopiert werden soll.

Ich habe es mit einer Datei von 920 MB Größe gemacht.

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 einige der anderen oben, weil nicht alle SQL-Dumps eine DROP TABLE Anweisung enthalten. Dieser wird alle Arten von Deponien funktionieren.

Tabelle mit derselben Struktur in beiden Dump und Datenbank präsentieren sollte.

`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`

Holen Sie sich einen anständigen Texteditor wie Notepad ++ oder Vim (wenn Sie mit ihm bereits geübt sind). Suchen Sie nach dem Tabellennamen und Sie sollten die nur markieren können, CREATE, ALTER und INSERT-Befehle für diese Tabelle. Es kann einfacher sein, mit Ihrer Tastatur zu navigieren, anstatt eine Maus. Und ich würde sicherstellen, dass Sie auf einer Maschine sind mit viel oder RAM, so dass es kein Problem hat, auf einmal die gesamte Datei zu laden. Sobald Sie die Zeilen, die Sie benötigen markiert und kopiert haben, wäre es eine gute Idee, nur den kopierten Teil in seine eigene Backup-Datei zu sichern und dann in MySQL importieren.

Die Stücke von SQL sind mit „Tabellenstruktur für Tabelle my_table“ und blockiert „Dumping Daten für Tabelle my_table.“

Sie können einen Windows-Befehlszeile wie folgt verwenden die Zeilennummern für die verschiedenen Abschnitte zu erhalten. Stellen Sie die gesuchte Zeichenkette nach Bedarf.

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

Im Folgenden wird zurückgegeben:

---------- sql.txt

[4384] - Tabellenstruktur für Tabelle my_table

[4500] - Dumping Daten für Tabelle my_table

[4514] - Tabellenstruktur für Tabelle some_other_table

... etc.

Das bekommt man die Zeilennummern Sie ... jetzt brauchen, wenn ich nur wüsste, wie man sie benutzt ... zu untersuchen.

Zurück in '08 hatte ich eine Notwendigkeit, dies zu tun. Ich schrieb einen Perl-Skript, das würde es tun, und es ist jetzt meine Methode der Wahl. Auch zusammengefasst, wie es in awk zu tun oder, wie an anderer Stelle und zu extrahieren wiederherzustellen. Vor kurzem habe ich diese sed Methode als auch auf der Liste. Sie können 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

habe ich versucht, ein paar Optionen, die unglaublich langsam waren. Dieses Split einen 360GB-Dump in seine Tabellen in wenigen Minuten:

Wie kann ich teilen Sie die Ausgabe von mysqldump in kleinere Dateien?

Die ‚sed‘ genannten Lösungen früher sind schön, aber nicht 100% sicher erwähnt

  • Sie können INSERT-Befehle mit Daten enthalten haben: ... CREATE TABLE ... (was auch immer) ... mytable ...

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

(und wenn die Tabelle sehr groß sind Sie nicht wollen, dass manuell überprüfen)

Ich würde die genaue Syntax der Dump-Version überprüfen verwendet, und habe eine restriktivere Mustersuche:

Vermeiden Sie „*“ und ‚^‘, um sicherzustellen, dass wir am Anfang der Zeile beginnen. Und ich würde es vorziehen, die Initiale ‚DROP‘ zu greifen

Alles in allem funktioniert das besser für mich:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top