Wie teile ich eine große MySQL-Sicherungsdatei in mehrere Dateien auf?


14

Ich habe eine 250 MB Backup-SQL-Datei, aber das Limit für das neue Hosting beträgt nur 100 MB ...

Gibt es ein Programm, mit dem Sie eine SQL-Datei in mehrere SQL-Dateien aufteilen können?

Es scheint, als würden die Leute die falsche Frage beantworten ... also werde ich mehr klarstellen:

Ich habe NUR die 250 MB Datei und habe nur das neue Hosting mit phpMyAdmin, das derzeit keine Daten in der Datenbank hat. Ich muss die 250-MB-Datei nehmen und auf den neuen Host hochladen, aber es gibt eine Größenbeschränkung für das Hochladen von 100-MB-SQL-Sicherungsdateien. Ich muss einfach eine zu große Datei in mehrere Dateien aufteilen, die jeweils nur vollständig gültige SQL-Anweisungen enthalten (keine Anweisungen können zwischen zwei Dateien aufgeteilt werden).


Müssen es mehrere gültige SQL-Dateien sein? Ich würde die Datei in 100 MB großen Blöcken in mehrere Archive komprimieren und diese hochladen.
Nifle

Ja, es müssen mehrere gültige SQL-Dateien sein ... soweit nicht die Hälfte einer Anweisung in einer Datei und die andere Hälfte in einer anderen Datei enthalten ist.
Brian T Hannan

Antworten:


5

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

Dump zuerst das Schema (es passt sicher in 2Mb, nein?)

mysqldump -d --all-databases

und wiederherstellen.

Speichern Sie anschließend nur die Daten in separaten Einfügeanweisungen, sodass Sie die Dateien aufteilen und wiederherstellen können, ohne sie auf dem Remoteserver verketten zu müssen

mysqldump --all-databases --extended-insert=FALSE --no-create-info=TRUE

Guter Rat! Macht perfekt Sinn. Wirklich gut, wenn es komplexe Abhängigkeiten zwischen Tabellen gibt, so dass eine Aufteilung des Exports von Schema und Daten nicht funktioniert.
Reed Richards

7

Der einfachste Weg, die Sicherungsdatei zu teilen, ist die Verwendung einer Software sqldumpsplitter, mit der Sie die Datenbankdatei in mehrere Datenbankdateien aufteilen können. Laden Sie hier

Oder verwenden Sie diesen Terminalbefehl.

split -l 600 ./path/to/source/file.sql ./path/to/dest/file-

Hier ist 600 die Anzahl der Zeilen, die Sie in Ihren geteilten Dateien haben möchten. Die beiden Argumente sind Quelle und Ziel der Dateien.

HINWEIS: Sie müssen die geteilten Dateien überprüfen, Sie teilen keinen Befehl.


1
Vielen Dank für den Hinweis in die richtige Richtung! Aber anstatt zu verwenden, splitempfehle ich zu verwenden csplit. Es wird nicht direkt nach einer bestimmten Zeilennummer aufgeteilt, die sich beispielsweise zwischen einer Werteliste befindet INSERT. Sie können einen regulären Ausdruck übergeben , um die zu teilenden Zeilen zu identifizieren. Verwenden Sie es beispielsweise folgendermaßen : `csplit -k dump.sql '/ ^ CREATE TABLE. * /' '{900}'` Dadurch wird Ihre Dump-Datei vor jeder create table …Anweisung aufgeteilt. Ändern Sie dies an Ihre Bedürfnisse. (Übrigens passiere ich {900}statt {*}weil ich eine Fehlermeldung "csplit: *}: schlechte Wiederholungszahl" bekomme , vielleicht nur ein Problem unter MacOS?)
Arvid

3

Ich habe mysqldumpsplitter (Shell-Skript) geschrieben, das die Datenbanken / Tabellen nach Anweisung schnell und einfach aufteilt. Sehen Sie sich alle möglichen Anwendungsfälle für das Extrahieren aus mysqldump an .

sh mysqldumpsplitter.sh --source mysqldump-file.sql --extract DB --match_str database-name


0

1) Haben Sie die Möglichkeit, die Datei mit einer anderen Methode hochzuladen, z. B. scp oder ftp, und sie dann aus der lokalen Datei wiederherzustellen?

2) Nimmt Ihr ISP die Datei auf CD und lädt sie für Sie?

3) Können Sie die Datei auf einem lokalen Server wiederherstellen und dann eine Reihe von Sicherungsdateien daraus erstellen, indem Sie bestimmte Kriterien verwenden, um die einzelnen Größen niedrig zu halten?

4) Sie könnten die Datei manuell teilen und dann die SQL-Befehle am Ende der Dateien aufräumen?


Ich dachte über Option 2, 3 und 4 nach. 2 wäre der letzte Ausweg. 3 ist wahrscheinlich das nächste, was ich versuchen werde. 4 war mein erster Gedanke, aber ich kann nicht einmal die große Datei im Editor oder einem Editor öffnen. Es dauert Stunden, um eine 250-MB-Datei mit dem gesamten Text zu öffnen. Alle Notepad-ähnlichen Apps frieren ein und kehren nie zurück.
Brian T Hannan

@Brian: 4 was my first thought, but I can't even open the large file in notepad or any editor - Notepad ++ kann gut damit umgehen. sonst Blick auf superuser.com/questions/34749/...
Sathyajith Bhat

Wenn Sie die Datei AUTOMATISCH aufteilen und dann die kleineren Teile aufräumen möchten, sehen Sie sich die Aufteilungsoption des Dienstprogramms Swiss File Knife ( stahlworks.com/dev/swiss-file-knife.html ) an
Linker3000

0

Sie können eine große Datei in Eclipse teilen. Ich habe eine 105-GB-Datei in Windows erfolgreich ausprobiert:

Fügen Sie einfach die MySQLDumpSplitter-Bibliothek zu Ihrem Projekt hinzu: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Kurzer Hinweis zum Importieren:

- In Eclipse, Right click on your project --> Import
- Select "File System" and then "Next"
- Browse the path of the jar file and press "Ok"
- Select (thick) the "MySQLDumpSplitter.jar" file and then "Finish"
- It will be added to your project and shown in the project folder in Package Explorer in Eclipse
- Double click on the jar file in Eclipse (in Package Explorer)
- The "MySQL Dump file splitter" window opens which you can specify the address of your dump file and proceed with split.

0

Ich hatte auch dieses Problem und entschied mich, einen extrem speicher- und CPU-effizienten Code zu codieren, der eine einzelne .sql-Datei in mehrere aufteilt (eine pro Tabelle).

Ich musste es schreiben, da jede andere Lösung, die ich fand, nicht gut genug lief. Auf einem echten 16-GB-Dump habe ich es geschafft, ihn in weniger als 2 Minuten aufzuteilen.

Der Code und die Anweisungen sind auf der Projektseite auf github verfügbar


0

Es gibt mehrere Optionen, wenn Sie ein Bash- oder Perl-Skript ausführen können. Probieren Sie dieses von yoodey.com

#!/usr/bin/perl -w
#
# splitmysqldump - split mysqldump file into per-database dump files.
use strict;
use warnings;
my $dbfile;
my $dbname = q{};
my $header = q{};
while (<>) {    

# Beginning of a new database section:
    # close currently open file and start a new one
    if (m/-- Current Database\: \`([-\w]+)\`/) {
    if (defined $dbfile && tell $dbfile != -1) {
        close $dbfile or die "Could not close file!"
    }
    $dbname = $1;
    open $dbfile, ">>", "$1_dump.sql" or die "Could not create file!";
    print $dbfile $header;
    print "Writing file $1_dump.sql ...\n";
    }
    if (defined

$dbfile && tell $dbfile != -1) {
    print $dbfile $_;
    }
    # Catch dump file header in the beginning
    # to be printed to each separate dump file.
    if (!

$dbname) { $header .= $_; }
}
close $dbfile or die "Could not close file!"

-1

Anstatt die Datei aufzuteilen, können Sie einen MySQL-Client auf Ihrem lokalen Computer verwenden und ihn mit der Remote-MySQL-Datenbank verbinden. Ich benutze HeidiSQL und finde es sehr gut.

Natürlich kann es eine Weile dauern, bis die 250 MB SQL-Anweisungen über das Internet gesendet werden.

Sie können auch BigDump ausprobieren

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.