2008-09-25 11 views
33

Ich muss ganze Tabellen von einer MySQL-Datenbank in eine andere verschieben. Ich habe keinen vollen Zugang zum zweiten, nur phpMyAdmin Zugang. 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.Wie teile ich die Ausgabe von mysqldump in kleinere Dateien?

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 dem Remote-Server zurückverfolgen kann.

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

bearbeiten

Das --extended-Insert = FALSE Option durch das erste Plakat vorgeschlagen MySQLDump ergibt eine SQL-Datei, die dann in importierbaren Dateien aufgeteilt werden kann, dass das Split (1) mit genannt wird eine geeignete --lines Option. Durch Versuch und Irrtum fand ich, dass bzip2 die .sql-Dateien um einen Faktor von 20 komprimiert, also musste ich herausfinden, wie viele Zeilen von SQL-Code ungefähr 40 MB entsprechen.

+0

schauen Sie sich dieses Q an, wenn Sie suchen, wie Sie [einen großen Postgresql-Dump in kleinere Dateien aufteilen] (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into-) kleinere Dateien) – rubo77

Antwort

28

Erste Dump das Schema (es passt sicher in 2MB, nicht wahr?)

mysqldump -d --all-databases 

und wiederherstellen.

Danach ist nur noch die Daten in separaten Insert-Anweisungen abladen, so können Sie die Dateien aufgeteilt und diese wiederherstellen, ohne dass sie auf dem Remote-Server

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

Ich suchte nach einer Möglichkeit, eine INSERT-Anweisung für jede eingefügte Zeile zu aktivieren, anstatt eine massive Anweisung mit vielen Tupeln oder jede Zeile mit VALUES zu verwenden. Das Flag "--extended-insert = FALSE" war das, was ich brauchte. Vielen Dank! – dmkc

+0

Create table: mysqldump mydatabase mytable -d mytable-create.sql Die daten: mysqldump mydatabase mytable -extended-insert = FALSE - no-create-info = TRUE> mytable-data.sql' spaltete es dann in eine Reihe von Dateien jeglicher Länge bis: 'aufgeteilt Mytable-data.sql -l10000' Jetzt können Sie zuerst die SQL erstellen importieren. Dann jede der Tabellen von 10.000 Länge. Standardmäßig heißen die Dateien xaa, xab, xac ...). Wichtig sie von 'mysql mydatabase liamvictor

0

Try csplit (1) verketten, die die Ausgabe zerschneiden in die einzelnen Tabellen basieren auf regulären Ausdrücken (passend zur Tabellengrenze würde ich denken).

1

können Sie Dump einzelne Tabellen mit mysqldump von mysqldump database table1 table2 ... tableN

läuft Falls keine der Tabellen zu groß sind, dass genug sein. Andernfalls müssen Sie die Daten in den größeren Tabellen aufteilen.

10

Sie sagen, dass Sie keinen Zugriff auf den zweiten Server haben. Aber wenn Sie Shell-Zugriff auf den ersten Server, wo die Tische sind, können Sie Ihre Dump durch Tabelle aufgeteilt:

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

Dies wird eine gzip-Datei für jede Tabelle erstellen.

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

mysqldump [connecting options] --tab=directory_name dbname

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

+0

Während dies möglicherweise nicht direkt OP Bedürfnisse erfüllen, ist es eine tolle Möglichkeit, einzelne Tabellen in ihre eigenen Dateien zu bekommen ... für Grep etc. –

2

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

In Ihrem PC, können Sie so etwas wie:

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

und fertig. :-)

Hoffnung dieses

0

Check out SQLDumpSplitter 2 hilft, ich kann es nur verwendet, um einen 40 MB-Dump mit Erfolg zu teilen. Sie können es unter dem folgenden Link erhalten:

sqldumpsplitter.com

Hope this Hilfe.

+0

Die URL funktioniert nicht mehr – cdmdotnet

+0

Was ist mit diesem: http://www.sqldumpsplitter.com/ – Sk8erPeter

+0

SQLDumpSplitter2 kann Dateien mit bis zu 2 GB nur verarbeiten (2 147 483 648 Bytes - es verwendet 32bit signed Integer für die Dateigröße, denke ich). Es könnte großartig sein, diesen Quellcode für 64bit zu modifizieren oder zu kompilieren, aber ich fürchte, der Quellcode ist wahrscheinlich verloren. Ansonsten ist es ein großartiges Werkzeug. Aber viele Probleme mit dem Teilen von SQL-Dateien beginnen irgendwo bei 2 GB Größe. –

1

ich würde das Dienstprogramm bigdump empfehlen, können Sie es hier greifen. http://www.ozerov.de/bigdump.php Dies staffelt die Ausführung des Dumps so nah wie möglich an Ihr Limit und führt ganze Zeilen gleichzeitig aus.

26

Dieses Bash-Skript teilt einen dumpfile einer Datenbank in separate Dateien für jede Tabelle und Namen mit csplit und Namen 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

+6

Beachten Sie, dass csplit auf dem Mac nicht mit diesem Skript funktioniert, da es die Syntax {*} nicht unterstützt. Müssen Sie es in Linux ausführen. – rlorenzo

+0

Gleiches unter FreeBSD. Aber Sie können dort den sysutils/corutils Port oder das Paket installieren, um GNU-Dienstprogramme zu erhalten und stattdessen gcsplit zu verwenden. – Dereckson

+0

So eine alte Antwort funktioniert aber immer noch, beeindruckend! –

0

Diese script tun sollten es:

#!/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

Sie können vorhandene Dateien nach AWK teilen. Es ist sehr quik und einfache

Lassen Sie uns aufgeteilt Tabelle Dump von ‚Tabellen‘:

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 durch ‚Datenbank‘

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

funktioniert nicht für mich – SpaceDog

2

Es ist dies eine ausgezeichnete mysqldumpsplitter Skript-Dump aufgespalten, die mit kommt Unmengen von Optionen, wenn es um das Extrahieren von mysqldump geht.

würde ich das Rezept hier kopiert Ihren Fall zur Auswahl:

1) einzelne Datenbank von mysqldump Extract:

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

obigem Befehl wird SQL für angegebene Datenbank erstellen aus dem angegebenen "Dateiname" SQL-Datei und speichern Sie es in komprimiertem Format zu Datenbank-Name.sql.gz.

2) von mysqldump einzigen Tabelle Auszug:

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

obige Befehl wird SQL für angegebene Tabelle aus den angegebenen "Dateiname" mysqldump Datei und speichern sie in einem komprimierten Format zu Datenbank-name.sql erstellen .gz. Auszug

3) Tabellen passende regulären Ausdruck von mysqldump:

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

Above Befehl erstellen sqls für Tabellen Matching regelmäßig angegeben Ausdruck von bestimmten "Dateinamen" mysqldump Datei und speichern sie in komprimiertem Format zu individuelle Tabellenname.sql.gz. Auszug

4) alle Datenbanken von mysqldump:

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

Above Befehl extrahieren alle Datenbanken von bestimmten "Dateiname" mysqldump Datei und speichern sie in einem komprimierten Format auf einzelne Datenbank-name.sql. gz.

5) Extrahieren Sie alle Tabelle aus mysqldump:

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

Befehl werden alle Tabellen aus den angegebenen "Dateiname" extrahieren mysqldump Datei und speichern sie in einem komprimierten Format zu einzelnen Tisch name.sql. gz. Auszug

6) Liste der Tabellen von mysqldump:

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

obigem Befehl wird extrahieren Tabellen aus dem angegebenen "Dateinamen" mysqldump-Datei und speichern sie in einem komprimierten Format auf einzelnen Tisch name.sql .gz.

7) Extrahieren Sie eine Datenbank aus komprimierten mysqldump:

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

obige Befehl wird filename.sql.gz mit gzip entpacken, extrahieren Datenbank mit dem Namen "DB-Name" von "filename.sql.gz" & Speichern Sie es als out/dbname.sql.gz

8) Extrahieren einer Datenbank aus komprimierten Mysqldump in einem unkomprimierten Format :

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

obige Befehl wird dekomprimieren filename.sql.gz gzip und extrahieren database "DB-Name" von „Dateiname dem Namen .sql.gz“& store es als Klar sql out/dbname.sql

9) Extrakt aus alltables mysqldump in anderen Ordner:

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

Befehl werden alle Tabellen von bestimmten "Dateiname" mysqldump-Datei extrahieren und extrahiert Tabellen in komprimiertem Format auf einzelne Dateien, Tabellen name.sql.gz unter/path gespeichert/to/Extrakte /. Das Skript erstellt den Ordner/path/to/extracts/falls nicht vorhanden.

10) Auszug einer oder mehr Tabellen aus einer Datenbank in einem Voll dump:

Betrachten Sie ein vollständiges Speicher-Abbild mit mehreren Datenbanken haben, und Sie wollen Extrakt einiger Tabellen aus einer Datenbank.

Extract einzigen Datenbank: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Extract alle Tabellen sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" obwohl wir eine weitere Möglichkeit, dies zu tun in einzelnen Befehl verwenden können, wie folgt:

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

Obiger Befehl sowohl tbl1 extrahieren und tbl2 aus DBNAME-Datenbank in SQL-Format unter Ordner "out" im aktuellen Verzeichnis.

Sie einzelne Tabelle extrahieren lassen sich wie folgt:

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

11) Extrahieren Sie alle Tabellen aus bestimmten Datenbank:

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

Befehl werden alle Tabellen aus DBNAME Datenbank in SQL extrahieren formatieren und speichern Sie es unter "out" -Verzeichnis.

12) Liste Inhalt der mysqldump Datei

mysqldumpsplitter.sh --source filename --desc

obigen Befehl werden Datenbanken und Tabellen aus der Dump-Datei auflisten.

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

  • Auch wenn Sie einzelne Tabelle extrahieren, die Sie denken, noch größer ist, können Sie Linux Split-Befehl mit der Anzahl der Zeilen weiter aufgeteilt, um die Dump verwenden. split -l 10000 filename.sql

  • Das heißt, wenn das Ihre Notwendigkeit ist (häufiger kommen), können Sie mit mydumper betrachten, die Sie nicht einzelne Deponien müssen tatsächlich schafft aufzuspalten!

1

Eine Klärung der Antwort von @ verace:

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

einfach die MySQLDumpSplitter Bibliothek zu Ihrem Projekt hinzufügen: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Quick Hinweis auf wie importieren: diese

- 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. 
Verwandte Themen