wake-up-neo.com

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

Ich muss ganze Tabellen von einer MySQL-Datenbank in eine andere verschieben. Ich habe keinen vollständigen Zugriff auf den zweiten, nur phpMyAdmin-Zugriff. Ich kann nur (komprimierte) SQL-Dateien hochladen, die kleiner als 2 MB sind. Die komprimierte Ausgabe eines mysqldump der Tabellen der ersten Datenbank ist jedoch größer als 10 MB.

Gibt es eine Möglichkeit, die Ausgabe von mysqldump in kleinere Dateien aufzuteilen? Ich kann split (1) nicht verwenden, da ich die Dateien nicht auf den Remote-Server zurücksetzen kann.

Oder gibt es eine andere Lösung, die ich vermisst habe?

Bearbeiten

Die im ersten Poster vorgeschlagene Option --extended-insert = FALSE für mysqldump enthält eine .sql-Datei, die dann in importierbare Dateien aufgeteilt werden kann, vorausgesetzt, split (1) wird mit einer geeigneten Option --lines aufgerufen. Durch Ausprobieren stellte ich fest, dass bzip2 die .sql-Dateien um den Faktor 20 komprimiert. Ich musste also herausfinden, wie viele Zeilen SQL-Code ungefähr 40 MB entsprechen.

38
lindelof

Zuerst das Schema ausgeben (es passt sicher in 2 MB, nein?)

mysqldump -d --all-databases 

und wieder herstellen.

Speichern Sie anschließend nur die Daten in separaten insert-Anweisungen, sodass Sie die Dateien aufteilen und wiederherstellen können, ohne sie auf dem Remote-Server verketten zu müssen

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

Dieses Bash-Skript teilt eine Datenbankdatei einer Datenbank in separate Dateien für jede Tabelle und Namen mit csplit auf und benennt sie entsprechend:

#!/bin/bash

####
# Split MySQL dump SQL file into one file per table
# based on https://Gist.github.com/jasny/1608062
####

#adjust this to your case:
START="/-- Table structure for table/"
# or 
#START="/DROP TABLE IF EXISTS/"


if [ $# -lt 1 ] || [[ $1 == "--help" ]] || [[ $1 == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " $0 DUMP_FILE"
        echo "extract one table:"
        echo " $0 DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table $2
        csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET [email protected]_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable $1 "$START" {*}
fi

[ $? -eq 0 ] || exit

mv table00 head

FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
        mv $FILE foot
else
        csplit -b '%d' -s -f$FILE $FILE "/40103 SET [email protected]_TIME_ZONE/" {*}
        mv ${FILE}1 foot
fi

for FILE in `ls -1 table*`; do
        NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
        cat head $FILE foot > "$NAME.sql"
done

rm head foot table*

basierend auf https://Gist.github.com/jasny/1608062
und https://stackoverflow.com/a/16840625/1069083

32
rubo77

Sie sagen, dass Sie keinen Zugriff auf den zweiten Server haben. Wenn Sie jedoch Shell-Zugriff auf den ersten Server haben, auf dem sich die Tabellen befinden, können Sie den Speicherauszug nach Tabelle aufteilen:

for T in `mysql -N -B -e 'show tables from dbname'`; \
   do echo $T; \
   mysqldump [connecting_options] dbname $T \
   | gzip -c > dbname_$T.dump.gz ; \
   done

Dadurch wird für jede Tabelle eine GZIP-Datei erstellt.

Eine andere Möglichkeit, die Ausgabe von mysqldump in separate Dateien aufzuteilen, ist die Option --tab.

mysqldump [connecting options] --tab=directory_name dbname 

woher verzeichnisname ist der Name eines leeren Verzeichnisses. Dieser Befehl erstellt für jede Tabelle eine SQL-Datei mit der Anweisung CREATE TABLE und eine TXT-Datei mit den Daten, die mit LOAD DATA INFILE wiederhergestellt werden sollen. Ich bin nicht sicher, ob phpMyAdmin diese Dateien mit Ihrer speziellen Einschränkung verarbeiten kann.

11
Giuseppe Maxia

Späte Antwort suchte jedoch nach der gleichen Lösung und stieß auf folgenden Code von der folgenden Website:

for I in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $I | gzip > "$I.sql.gz"; done

http://www.commandlinefu.com/commands/view/2916/backup-all-mysql-databases-to-individualfiles

9
Lee Haskings

Ich habe kürzlich sqlsplit.com erstellt. Versuch es.

4
vbarbarosh

Es gibt dieses ausgezeichnete mysqldumpsplitter -skript, das eine Unmenge an Optionen für das Extrahieren von mysqldump enthält.

Ich würde das Rezept hier kopieren, um Ihren Fall auszuwählen:

1) Einzelne Datenbank aus mysqldump extrahieren:

sh mysqldumpsplitter.sh --source filename --extract DB --match_str database-name

Der obige Befehl erstellt sql für die angegebene Datenbank aus der angegebenen "Dateiname" SQL-Datei und speichern Sie es in komprimiertem Format in Datenbankname.sql.gz.

2) Einzelne Tabelle aus mysqldump extrahieren:

sh mysqldumpsplitter.sh --source filename --extract TABLE --match_str table-name

Der obige Befehl erstellt SQL aus der angegebenen .__ für die angegebene Tabelle. "Dateiname" mysqldump-Datei und speichern Sie sie im komprimierten Format unter Datenbankname.sql.gz.

3) Extrahieren Sie Tabellen, die mit regulären Ausdrücken übereinstimmen, aus mysqldump:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str regular-expression

Der obige Befehl erstellt sqls für Tabellen, die mit dem angegebenen regulären .__ übereinstimmen. Ausdruck aus der angegebenen "Dateiname" mysqldump-Datei und speichern Sie sie in komprimiertes Format in einzelne Tabellenname.sql.gz.

4) Extrahieren Sie alle Datenbanken aus mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLDBS

Der obige Befehl extrahiert alle Datenbanken aus dem angegebenen "Dateinamen" mysqldump-Datei und speichern Sie sie im komprimierten Format in einzelne Datenbankname.sql.gz.

5) Extrahieren Sie alle Tabelle aus mysqldump:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES

Der obige Befehl extrahiert alle Tabellen aus dem angegebenen "Dateinamen" mysqldump-Datei und speichern Sie sie im komprimierten Format in einzelne Tabellenname.sql.gz.

6) Liste der Tabellen aus mysqldump extrahieren:

sh mysqldumpsplitter.sh --source filename --extract REGEXP --match_str '(table1|table2|table3)'

Der obige Befehl extrahiert Tabellen aus dem angegebenen "Dateinamen" mysqldump-Datei und speichert sie in komprimiertem Format in einzelne Tabellenname.sql.gz.

7) Extrahieren Sie eine Datenbank aus komprimiertem mysqldump:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip

Der obige Befehl dekomprimiert filename.sql.gz mit gzip und extrahiert Datenbank mit dem Namen "dbname" aus "filename.sql.gz" und als .__ speichern. out/dbname.sql.gz

8) Extrahieren Sie eine Datenbank aus komprimiertem mysqldump in einem unkomprimierten Format:

sh mysqldumpsplitter.sh --source filename.sql.gz --extract DB --match_str 'dbname' --decompression gzip --compression none

Der obige Befehl dekomprimiert dateiname.sql.gz mit gzip und extrahiert Datenbank mit dem Namen "dbname" aus "filename.sql.gz" und als einfache SQL-Datei speichern out/dbname.sql

9) Extrahieren Sie alle Tabellen aus mysqldump in einen anderen Ordner:

sh mysqldumpsplitter.sh --source filename --extract ALLTABLES --output_dir /path/to/extracts/

Der obige Befehl extrahiert alle Tabellen aus dem angegebenen "Dateinamen" mysqldump-Datei und extrahiert Tabellen im komprimierten Format in einzelne Dateien, Tabellenname.sql.gz gespeichert unter/path/to/extract /. Das Skript erstellt den Ordner/Pfad/to/extract /, falls nicht vorhanden.

10) Extrahieren Sie eine oder mehrere Tabellen aus einer Datenbank in einem vollständigen Speicherauszug:

Stellen Sie sich vor, Sie haben einen vollständigen Speicherauszug mit mehreren Datenbanken und möchten extrahieren Sie einige Tabellen aus einer Datenbank.

Einzelne Datenbank extrahieren: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Extrahieren Sie alle Tabellen sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)", obwohl wir eine andere Option verwenden können, um dies in einem einzelnen Befehl wie folgt auszuführen:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1|tbl2)" --compression none

Der obige Befehl extrahiert sowohl tbl1 als auch tbl2 aus der DBNAME-Datenbank in SQL-Format unter Ordner "out" im aktuellen Verzeichnis.

Sie können eine einzelne Tabelle wie folgt extrahieren:

sh mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.(tbl1)" --compression none

11) Extrahieren Sie alle Tabellen aus einer bestimmten Datenbank:

mysqldumpsplitter.sh --source filename --extract DBTABLE --match_str "DBNAME.*" --compression none

Der obige Befehl extrahiert alle Tabellen aus der DBNAME-Datenbank in sql formatieren und unter "out" speichern.

12) Listen Sie den Inhalt der mysqldump-Datei auf

mysqldumpsplitter.sh --source filename --desc

Der obige Befehl listet Datenbanken und Tabellen aus der Dump-Datei auf.

Sie können später wählen, die Dateien zu laden: zcat Dateiname.sql.gz | mysql -uUSER -p -hHOSTNAME

  • Sobald Sie eine einzelne Tabelle extrahiert haben, von der Sie glauben, dass sie noch größer ist, können Sie den Linux-Split-Befehl mit der Anzahl der Zeilen verwenden, um den Speicherauszug weiter zu teilen .split -l 10000 filename.sql

  • Das heißt, wenn dies Ihr Bedürfnis ist (häufiger), könnten Sie mydumper in Betracht ziehen, das tatsächlich einzelne Dumps erstellt, die Sie nicht teilen müssen!

4
mysql_user

Sie benötigen keinen SSH-Zugriff auf einen Ihrer Server. Nur ein mysql [dump] -Klient ist in Ordnung ..__ Mit dem mysql [dump] können Sie Ihre Datenbank sichern und erneut importieren.

In Ihrem PC können Sie Folgendes tun:

$ mysqldump -u originaluser -poriginalpassword -h originalhost originaldatabase | mysql -u neuer Benutzer -pnewpassword -h newhost newdatabase

und du bist fertig. :-)

hoffe das hilft

2
user185696

Sie können einzelne Tabellen mit mysqldump ausgeben, indem Sie mysqldump database table1 table2 ... tableN ausführen.

Wenn keine der Tabellen zu groß ist, reicht das aus. Andernfalls müssen Sie die Daten in den größeren Tabellen aufteilen.

1
skoob

Eine Klarstellung zur Antwort von @ Vérace:

Ich mag besonders die interaktive Methode; Sie können eine große Datei in Eclipse aufteilen. Ich habe eine 105GB-Datei in Windows erfolgreich getestet:

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.
1
Alisa

ich würde das Dienstprogramm Bigdump empfehlen, Sie können es hier holen. http://www.ozerov.de/bigdump.php Dies versetzt die Ausführung des Speicherauszugs so nahe wie möglich an Ihr Limit und führt jeweils ganze Zeilen aus.

1
LittleT15

Schauen Sie sich SQLDumpSplitter 2 an. Ich habe es gerade verwendet, um einen 40-MB-Dump mit Erfolg zu teilen. Sie können es unter dem folgenden Link erhalten: 

sqldumpsplitter.com

Ich hoffe das hilft. 

0
direct

Dieses Skript sollte es tun:

#!/bin/sh

#edit these
USER=""
PASSWORD=""
MYSQLDIR="/path/to/backupdir"

MYSQLDUMP="/usr/bin/mysqldump"
MYSQL="/usr/bin/mysql"

echo - Dumping tables for each DB
databases=`$MYSQL --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"`
for db in $databases; do
    echo - Creating "$db" DB
    mkdir $MYSQLDIR/$db
    chmod -R 777 $MYSQLDIR/$db
    for tb in `$MYSQL  --user=$USER --password=$PASSWORD -N -B -e "use $db ;show tables"`
        do 
            echo -- Creating table $tb
            $MYSQLDUMP --opt  --delayed-insert --insert-ignore --user=$USER --password=$PASSWORD $db $tb | bzip2 -c > $MYSQLDIR/$db/$tb.sql.bz2
    done
    echo
done
0
gadelkareem

Sie können vorhandene Dateien nach AWK aufteilen. Es ist sehr schnell und einfach

Lassen Sie uns den Tabellenauszug nach 'tables' aufteilen:

cat dump.sql | awk 'BEGIN {output = "comments"; }
$data ~ /^CREATE TABLE/ {close(output); output = substr($3,2,length($3)-2); }
{ print $data >> output }';

Oder Sie können Dump nach 'Datenbank' aufteilen

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=$4;} {print $data>>output}';
0
zalex

Versuchen Sie Folgendes: https://github.com/shenli/mysqldump-hugetable .__ Es werden Daten in viele kleine Dateien gespeichert. Jede Datei enthält weniger oder gleich viele MAX_RECORDS-Datensätze. Sie können diesen Parameter in env.sh einstellen.

0
shenli3514

Ich habe eine neue Version von SQLDumpSplitter geschrieben, diesmal mit einem richtigen Parser, der es erlaubt, schöne Dinge wie INSERTs mit vielen Werten auf Dateien aufzuteilen, und es ist jetzt mehrere Plattformen: https://philiplb.de/sqldumpsplitter3/

0
Philip

Versuchen Sie csplit (1), um die Ausgabe basierend auf regulären Ausdrücken in die einzelnen Tabellen zu unterteilen (entspricht der Tabellengrenze, denke ich).

0
jj33

Ich habe MySQLDumpSplitter.Java erstellt, das im Gegensatz zu Bash-Skripts unter Windows funktioniert. Es ist hier verfügbar. https://github.com/Verace/MySQLDumpSplitter .

0
Vérace