2008-09-25 7 views
33

J'ai besoin de déplacer des tables entières d'une base de données MySQL à une autre. Je n'ai pas un accès complet au second, seul l'accès phpMyAdmin. Je ne peux que télécharger des fichiers SQL (compressés) de taille inférieure à 2 Mo. Mais la sortie compressée d'un mysqldump des tables de la première base de données est supérieure à 10 Mo.Comment diviser la sortie de mysqldump en fichiers plus petits?

Existe-t-il un moyen de diviser la sortie de mysqldump en fichiers plus petits? Je ne peux pas utiliser split (1) car je ne peux pas cat (1) les fichiers sur le serveur distant.

Ou y at-il une autre solution que j'ai manquée?

Modifier

L'option --extended-insert = FALSE à Mysqldump suggéré par la première affiche donne un fichier sql qui peut ensuite être divisé en fichiers importables, à condition que deux parties (1) est appelée avec une option --lines appropriée. Par essais et erreurs, j'ai trouvé que bzip2 compresse les fichiers .sql d'un facteur de 20, j'ai donc dû déterminer combien de lignes de code sql correspondaient approximativement à 40Mo.

+0

Regardez ce Q au cas où vous cherchiez comment [fractionner un grand vidage postgresql en fichiers plus petits] (http://unix.stackexchange.com/questions/351546/split-a-large-postgresql-dump-into- petits-fichiers) – rubo77

Répondre

28

premier dump le schéma (il tient sûrement à 2Mb, non?)

mysqldump -d --all-databases 

et restaurer.

décharge Après que les données contenues dans les instructions d'insertion séparées, de sorte que vous pouvez diviser les fichiers et les restaurer sans avoir à les concaténer sur le serveur distant

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

Je cherchais un moyen d'activer une instruction INSERT pour chaque ligne insérée, plutôt qu'une instruction massive avec plusieurs tuples ou chaque ligne utilisant des valeurs. Le drapeau '--extended-insert = FALSE' était ce dont j'avais besoin. Merci! – dmkc

+0

Créer une table: 'mysqldump mydatabase mytable -d> mytable-create.sql' Les données: ' mysqldump mydatabase mytable --extended-insert = FAUX --no-create-info = TRUE> mytable-data.sql' ensuite le diviser en une série de fichiers de quelque longueur: 'diviser matable-data.sql -l10000' maintenant, vous pouvez importer d'abord la créer SQL. Puis chacune des tables de 10 000 longueurs. Par défaut, les fichiers seront nommés xaa, xab, xac ...). Important par 'mysql mydatabase liamvictor

0

Essayez csplit (1) pour couper la sortie en les tables individuelles basées sur des expressions régulières (correspondant à la limite de la table, je pense).

1

Vous pouvez vider les tables individuelles avec mysqldump en exécutant mysqldump database table1 table2 ... tableN

Si aucune des tables sont trop grandes, ce sera suffisant. Sinon, vous devrez commencer à scinder les données dans les grandes tables.

10

Vous dites que vous n'avez pas accès au second serveur. Mais si vous avez un accès shell au premier serveur, où les tables sont, vous pouvez diviser votre décharge par la table:

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

Cela va créer un fichier gzip pour chaque table.

Une autre façon de diviser la sortie de mysqldump dans des fichiers séparés est d'utiliser l'option --tab.

mysqldump [connecting options] --tab=directory_name dbname

directory_name est le nom d'un répertoire vide. Cette commande crée un fichier .sql pour chaque table contenant l'instruction CREATE TABLE et un fichier .txt contenant les données à restaurer à l'aide de LOAD DATA INFILE. Je ne suis pas sûr si phpMyAdmin peut gérer ces fichiers avec votre restriction particulière, cependant.

+0

Bien que cela ne puisse pas répondre directement aux besoins de l'OP, c'est une façon géniale d'obtenir des tables individuelles dans leurs propres fichiers ... pour grep etc. –

2

Vous n'avez pas besoin d'accéder à l'un de vos serveurs. Juste un client mysql [dump] va bien. Avec mysql [dump], vous pouvez vider votre base de données et l'importer à nouveau.

Dans votre PC, vous pouvez faire quelque chose comme:

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

et vous avez terminé. :-)

espérons que cette aide

0

Check out SQLDumpSplitter 2, je viens d'utiliser pour diviser une décharge de 40 Mo avec succès. Vous pouvez l'obtenir sur le lien ci-dessous:

sqldumpsplitter.com

Hope this aide.

+0

L'URL ne fonctionne plus – cdmdotnet

+0

Qu'en est-il de celui-ci: http://www.sqldumpsplitter.com/ – Sk8erPeter

+0

SQLDumpSplitter2 peut gérer des fichiers jusqu'à 2 Go seulement (2 147 483 648 octets - il utilise un entier signé 32 bits pour la taille du fichier, je pense). Il pourrait être génial de modifier ceci ou de compiler le code source original pour 64bits, mais j'ai peur que le code source soit probablement perdu. Sinon, c'est un excellent outil. Mais de nombreux problèmes avec le fractionnement des fichiers SQL commencent quelque part autour de 2 Go de taille. –

1

Je recommanderais le BigDump utilitaire, vous pouvez le saisir ici. http://www.ozerov.de/bigdump.php Cela ternit l'exécution de la sauvegarde, aussi près que possible de votre limite, en exécutant des lignes entières à la fois.

26

Ce script bash divise une dumpfile d'une base de données dans des fichiers séparés pour chaque table et les noms avec csplit et les nomme en conséquence:

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

basé sur https://gist.github.com/jasny/1608062
et https://stackoverflow.com/a/16840625/1069083

+6

Veuillez noter que csplit sur Mac ne fonctionne pas avec ce script car il ne supporte pas la syntaxe {*}. Besoin de l'exécuter sous Linux. – rlorenzo

+0

Idem sur FreeBSD. Mais vous pouvez y installer le port ou le paquet sysutils/coreutils pour obtenir les utilitaires GNU et utiliser gcsplit à la place. – Dereckson

+0

Une telle vieille réponse mais fonctionne toujours, impressionnant! –

0

Ce script devrait faire il:

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

Vous pouvez diviser le fichier existant par AWK. Il est très Quik et simple

Soit décharge de table divisé par 'tables':

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

Ou vous pouvez diviser décharge par 'base de données'

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

ne fonctionne pas pour moi – SpaceDog

2

Il y a cet excellent scénario mysqldumpsplitter qui vient avec des tonnes d'options pour extraire-de-mysqldump.

je copier la recette ici pour choisir votre cas de:

1) Extrait seule base de données à partir mysqldump:

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

commande ci-dessus va créer sql pour la base de données spécifiée de spécifiée "sql" fichier sql et le stocker au format compressé à database-name.sql.gz.

2) Extrait table unique de mysqldump:

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

commande ci-dessus va créer sql pour la table spécifiée à partir spécifiée "nom de fichier" fichier mysqldump et le stocker dans un format compressé à base de données name.sql .gz.

3) Extrait des tableaux correspondant à l'expression régulière de mysqldump:

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

commande ci-dessus va créer sqls pour les tables correspondant spécifié expression régulière de spécifié "nom de fichier" fichier mysqldump et le stocker dans format compressé à table-name.sql.gz individuelle.

4) Extrait toutes les bases de mysqldump:

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

commande ci-dessus va extraire toutes les bases de données spécifiées "nom de fichier" fichier mysqldump et le stocker dans un format compressé à base de données individuelle name.sql . gz.

5) Extrait toutes les tables de mysqldump:

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

commande ci-dessus va extraire toutes les tables de spécifié "nom de fichier" fichier mysqldump et le stocker dans un format compressé à l'individu table name.sql. gz.

6) Extrait Liste des tableaux de mysqldump:

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

commande ci-dessus extraira tables du spécifié "nom de fichier" fichier mysqldump et de les stocker dans un format compressé à individuel table name.sql .gz.

7) Extrait d'une base de données mysqldump comprimé:

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

commande ci-dessus décompresse filename.sql.gz avec gzip, extraire la base de données nommée "dbname" de "filename.sql.gz" & stockez-le en tant que out/dbname.sql.gz

8) Extrait d'une base de données mysqldump compressée dans un format non compressé :

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

commande ci-dessus décompresse filename.sql.gz avec gzip et extraire la base de données nommé "dbname" du « nom de fichier .sql.gz » & magasin comme sql plaine out/dbname.sql

9) Extrait AllTables de mysqldump dans un autre dossier: 01

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

commande ci-dessus va extraire toutes les tables de spécifié "nom de fichier" fichier mysqldump et extraits des tables en format compressé pour des fichiers individuels , table-name.sql.gz stocké sous/chemin/vers/extraits /. Le script créera le dossier/chemin/vers/extraits/s'il n'existe pas.

10) Extrait une ou plusieurs tables d'une base dans une décharge complète:

Considérez vous avez un vidage complet avec plusieurs bases de données et que vous voulez extraire quelques tables d'une base de données.

Extrait base de données unique: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

Extrait toutes les tables sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" si nous pouvons utiliser une autre option pour faire en commande unique comme suit:

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

commande ci-dessus va extraire les deux tbl1 et tbl2 de Base de données DBNAME au format sql sous le dossier "out" dans le répertoire courant.

Vous pouvez extraire une seule table comme suit:

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

11) Extrait toutes les tables de base de données spécifique:

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

commande ci-dessus va extraire toutes les tables de base de données DBNAME dans sql et stockez-le dans le répertoire "out".

contenu Liste

12) du fichier mysqldump

mysqldumpsplitter.sh --source filename --desc

commande ci-dessus listera les bases de données et tables à partir du fichier de vidage.

Vous pouvez choisir ultérieurement de charger les fichiers: zcat filename.sql.gz | mysql -uUser -p -hHOSTNAME

  • Aussi une fois que vous extrayez seule table que vous pensez est encore plus grand, vous pouvez utiliser la commande split linux avec le nombre de lignes pour diviser davantage la décharge. split -l 10000 filename.sql

  • Cela dit, si tel est votre besoin (à venir plus souvent), vous pouvez envisager d'utiliser mydumper qui crée effectivement des décharges individuelles que vous n'aurez pas besoin de partager!

1

Une clarification sur la réponse de @ Verace:

I spécialement comme la méthode interactive; vous pouvez diviser un gros fichier dans Eclipse. J'ai essayé un fichier 105GB dans Windows avec succès:

il suffit d'ajouter la bibliothèque de MySQLDumpSplitter à votre projet: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Note rapide sur l'importation:

- 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. 
Questions connexes