Comment diviser la sortie de mysqldump en petits fichiers?

je dois déplacer des tables entières d'une base de données MySQL à une autre. Je n'ai pas accès à la seconde, seulement à phpMyAdmin. Je ne peux télécharger que des fichiers sql (compressés) inférieurs à 2 Mo. Mais la sortie compressée d'un mysqldump des tables de la première base de données est plus grande que 10MB.

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

ou y a-t-il une autre solution que j'ai manquée?

Modifier

l'option --extended-insert=FALSE à mysqldump suggérée par le premier poster donne A.fichier sql qui peut ensuite être divisé en fichiers importables, à condition que split(1) soit appelé avec une option --lines appropriée. Par tâtonnements, j'ai constaté que bzip2 comprime le .fichiers sql par un facteur de 20, donc j'ai dû comprendre combien de lignes de code sql correspondent à peu près à 40 MO.

37
demandé sur lindelof 2008-09-25 16:08:05

16 réponses

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

mysqldump -d --all-databases 

et le restaurer.

ensuite dump seulement les données dans les instructions insert 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
28
répondu Vinko Vrsalovic 2008-09-25 12:21:38

ce script bash divise un fichier dump d'une base de données en fichiers séparés pour chaque table et les noms avec csplit et les noms 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 ] || [[  == "--help" ]] || [[  == "-h" ]] ; then
        echo "USAGE: extract all tables:"
        echo " "151900920" DUMP_FILE"
        echo "extract one table:"
        echo " "151900920" DUMP_FILE [TABLE]"
        exit
fi

if [ $# -ge 2 ] ; then
        #extract one table 
        csplit -s -ftable  "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
        #extract all tables
        csplit -s -ftable  "$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 TIME_ZONE=@OLD_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

30
répondu rubo77 2017-05-23 12:02:42

vous dites que vous n'avez pas accès au second serveur. Mais si vous avez un accès shell au premier serveur, où se trouvent les tables, vous pouvez diviser votre dump par 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 créera un fichier gzip pour chaque table.

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

mysqldump [connecting options] --tab=directory_name dbname 

directory_name est le nom d'un vide répertoire. Cette commande crée un .fichier sql pour chaque table, contenant L'instruction CREATE TABLE, ET A.fichier txt, contenant les données, à restaurer en utilisant LOAD DATA INFILE. Je ne suis pas sûr que phpMyAdmin puisse gérer ces fichiers avec votre restriction particulière.

10
répondu Giuseppe Maxia 2008-09-25 16:15:19

réponse tardive, mais était à la recherche de la même solution et est tombé sur le code suivant d'en bas site web:

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-individual-files

9
répondu Lee Haskings 2011-01-22 03:39:41

j'ai récemment créé sqlsplit.com . De l'essayer.

4
répondu vbarbarosh 2014-08-03 13:04:56

il y a cet excellent mysqldumpsplitter script qui vient avec des tonnes d'option pour quand il s'agit d'extraire-de-mysqldump.

je voudrais copier la recette ici pour choisir votre cas de:

1) extraire une seule base de données de mysqldump:

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

la commande ci-dessus va créer sql pour la base de données spécifiée "filename" fichier sql et de le stocker dans un format comprimé à base de données-nom.SQL.gz.

2) Extraire une seule table 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 de spécifié "filename" fichier mysqldump et le stocker dans un format comprimé à base de données-nom.SQL.gz.

3) Extrait des tables de correspondance d'expression régulière de la commande mysqldump:

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

la commande ci-dessus va créer des sqls pour les tables correspondant à la norme spécifiée expression à partir du fichier "nom de fichier" mysqldump spécifié et stockez-le dans format comprimé à nom de table individuel.SQL.gz.

4) extraire toutes les bases de données de mysqldump:

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

la commande ci-dessus extraira toutes les bases de données à partir de "nom de fichier spécifié" fichier mysqldump et conservez-le sous forme compressée à l'individu base de données-nom.SQL.gz.

5) extraire toute la table de mysqldump:

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

la commande ci-dessus extraira toutes les tables à partir de "nom de fichier spécifié" mysqldump fichier et le stocker dans un format comprimé à l'individu table-name.SQL.gz.

6) extrait de la liste des tableaux de mysqldump:

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

la commande ci-dessus extraira les tables à partir du "nom de fichier spécifié" mysqldump fichier et les stocker dans un format comprimé à l'individu table-name.SQL.gz.

7) extraire une base de données de mysqldump compressé:

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

la commande ci-dessus décompresse le nom du fichier.SQL.gz à l'aide de gzip, extrait de base de données nommée " dbname "à partir de" filename.SQL.gz" et le stocker en tant que /dbname.SQL.gz

8) extraire une base de données de mysqldump compressé dans un uncompressed format:

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

la commande ci-dessus décompresse le nom du fichier.SQL.gz utilisant gzip et extract base de données nommée " dbname "à partir de" filename.SQL.gz" et les stocker au format sql /dbname.sql

9) extraire alltables de mysqldump dans un dossier différent:

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

la commande ci-dessus extraira toutes les tables à partir de "nom de fichier spécifié" fichier mysqldump et extrait des tables dans le format comprimé à l'individu les fichiers de table, le nom.SQL.gz stockés dans /chemin/vers/extraits/. Script va créer le dossier /chemin/vers/extraits/ si n'existe pas.

10) extraire un ou plusieurs tableaux d'une base de données dans un dump complet:

Considérez que vous avez un vidage complet avec de multiples bases de données et que vous voulez extrait quelques tables à partir d'une base de données.

extrait d'une seule base de données: sh mysqldumpsplitter.sh --source filename --extract DB --match_str DBNAME --compression none

extraire tous les tableaux sh mysqldumpsplitter.sh --source out/DBNAME.sql --extract REGEXP --match_str "(tbl1|tbl2)" bien que nous puissions utiliser une autre option pour le faire en une seule commande comme suit:

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

la commande ci-dessus extraira à la fois tbl1 et tbl2 de la base de données DBNAME format sql sous le dossier " out " dans le répertoire courant.

vous pouvez extraire tableau unique comme suit:

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

11) extraire tous les tableaux de la base de données spécifique:

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

la commande ci-dessus extraira toutes les tables de la base de données DBNAME en sql formater et stocker dans le répertoire "out".

12) Liste du contenu du fichier mysqldump

mysqldumpsplitter.sh --source filename --desc

La commande ci-dessus listera les bases de données et les tables du fichier dump.

vous pouvez ensuite choisir de charger les fichiers: Nom de fichier zcat.SQL.GZ / mysql-uUSER-p-hHOSTNAME

  • aussi une fois que vous avez extrait une table que vous pensez encore plus grande, vous pouvez utiliser la commande linux split avec le nombre de lignes pour diviser le dump. split -l 10000 filename.sql

  • cela dit, si c'est votre besoin (venir plus souvent), vous pourriez envisager d'utiliser mydumper qui crée réellement des dumps individuels que vous n'aurez pas besoin de partager!

3
répondu mysql_user 2015-08-12 05:53:14

vous n'avez pas besoin de l'accès ssh à l'un de vos serveurs. Juste un client mysql[dump] est très bien. Avec le 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 c'est fini. :- )

espérons que cette aide

2
répondu 2009-10-07 15:08:59

vous pouvez vider des tables individuelles avec mysqldump en exécutant mysqldump database table1 table2 ... tableN

si aucune des tables n'est trop grande, cela suffira. Sinon, vous devrez commencer à diviser les données dans les tableaux plus grands.

1
répondu skoob 2008-09-25 12:20:14

je recommande l'utilitaire bigdump, vous pouvez l'attraper ici. http://www.ozerov.de/bigdump.php cela décale l'exécution du dump, aussi proche que possible de votre limite, en exécutant des lignes entières à la fois.

1
répondu LittleT15 2011-02-19 13:47:35

une clarification sur la réponse de @Vérace:

j'aime particulièrement la méthode interactive; vous pouvez fendre un grand fichier dans Eclipse. J'ai essayé avec succès un fichier 105GO sous Windows:

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

note rapide sur la façon d'importer:

- 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
répondu Alisa 2015-06-22 19:39:41

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

0
répondu jj33 2008-09-25 12:18:52

Ce script devrait le faire:

#!/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
répondu gadelkareem 2012-11-16 00:58:34

Check out SQLDumpSplitter 2, Je l'ai juste utilisé pour partager un dump de 40 Mo avec succès. Vous pouvez l'obtenir au lien ci-dessous:

sqldumpsplitter.com

Espérons que cette aide.

0
répondu direct 2013-12-28 03:37:43

j'ai créé MySQLDumpSplitter.java qui, contrairement aux scripts bash, fonctionne sur Windows. C'est disponible ici https://github.com/Verace/MySQLDumpSplitter .

0
répondu Vérace 2014-02-07 21:27:03

vous pouvez diviser le fichier existant par AWK. C'est très calme et simple

divisons table dump par 'tables':

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

ou vous pouvez diviser dump par "base de données "

cat backup.sql | awk 'BEGIN {output="comments";} $data ~ /Current Database/ {close(output);output=;} {print $data>>output}';
0
répondu zalex 2014-11-02 09:16:52

essayez ceci: https://github.com/shenli/mysqldump-hugetable Il va décharger des données dans de nombreux petits fichiers. Chaque fichier contient des enregistrements MAX_RECORDS inférieurs ou égaux. Vous pouvez définir ce paramètre en env.sh.

0
répondu shenli3514 2015-11-21 02:52:13