web-dev-qa-db-fra.com

Comment diviser la sortie de mysqldump en fichiers plus petits?

Je dois 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, uniquement un accès phpMyAdmin. Je ne peux télécharger que des fichiers (compressés) SQL inférieurs à 2 Mo. Mais la sortie compressée d'un mysqldump des tables de la première base de données dépasse 10 Mo.

Est-il possible de scinder la sortie de mysqldump en fichiers plus petits? Je ne peux pas utiliser split (1) car je ne peux pas lire les fichiers (1) sur le serveur distant.

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

Modifier

L'option --extended-insert = FALSE de mysqldump suggérée par la première affiche donne un fichier .sql qui peut ensuite être scindé en fichiers importables, à condition que split (1) soit appelé avec l'option --lines appropriée. Par essais et erreurs, j’ai trouvé que bzip2 compressait les fichiers .sql d’un facteur 20; je devais donc déterminer le nombre de lignes de code SQL correspondant à environ 40 Mo.

38
lindelof

Commencez par vider le schéma (il correspond sûrement à 2 Mo, non?)

mysqldump -d --all-databases 

et le restaurer.

Ne dumpez ensuite que les données dans des instructions d’insertion distinctes pour pouvoir scinder les fichiers et les restaurer sans avoir à les concaténer sur le serveur distant

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

Ce script bash divise un fichier de vidage d'une base de données en fichiers séparés pour chaque table et nomme 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 TIME_ZONE=@OLD_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 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

32
rubo77

Vous dites que vous n’avez pas accès au deuxième serveur. Mais si vous avez un accès Shell au premier serveur, où se trouvent les tables, vous pouvez fractionner votre vidage 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 fractionner la sortie de mysqldump en fichiers séparés consiste à utiliser l'option --tab.

mysqldump [connecting options] --tab=directory_name dbname 

où nom_répertoire 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 cependant pas sûr que phpMyAdmin puisse gérer ces fichiers avec votre restriction particulière.

11
Giuseppe Maxia

Réponse tardive mais cherchant la même solution et tombé sur le code ci-dessous:

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
Lee Haskings

J'ai récemment créé sqlsplit.com . Essaye le.

4
vbarbarosh

Il y a cet excellent mysqldumpsplitter script qui contient de nombreuses options pour extraire-de-mysqldump.

Je copierais la recette ici pour choisir votre cas parmi:

1) Extraire une base de données unique de mysqldump:

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

La commande ci-dessus créera SQL pour la base de données spécifiée à partir de .__ spécifié. "nom de fichier" fichier SQL et le stocker dans un format compressé à nom-base-données.sql.gz.

2) Extraire une seule table de mysqldump:

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

La commande ci-dessus créera SQL pour la table spécifiée à partir de .__ spécifié. "filename" dans le fichier mysqldump et stockez-le au format compressé dans nom-base-données.sql.gz.

3) Extrayez les tables correspondant à l'expression régulière de mysqldump:

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

La commande ci-dessus créera des fichiers sqls pour les tables correspondant aux fichiers Réguliers spécifiés. expression à partir du fichier "nom de fichier" mysqldump spécifié et le stocker dans format compressé en nom de table individuel.sql.gz.

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

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

La commande ci-dessus va extraire toutes les bases de données du "nom de fichier" spécifié mysqldump et stockez-le au format compressé dans un fichier .__ individuel. nom-base-données.sql.gz.

5) Extraire toutes les tables de mysqldump:

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

La commande ci-dessus va extraire toutes les tables du "nom de fichier" spécifié mysqldump et stockez-le au format compressé dans un fichier .__ individuel. nom-table.sql.gz.

6) Extraire la liste des tables de mysqldump:

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

La commande ci-dessus va extraire les tables du "nom de fichier" spécifié mysqldump et stockez-les au format compressé en fichier .__ individuel. nom-table.sql.gz.

7) Extrayez 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écompressera filename.sql.gz en utilisant gzip, extrayez la base de données nommée "nombase" dans "nomfichier.sql.gz" & stockez-la sous out/nombase.sql.gz

8) Extraire une base de données de mysqldump compressé dans un fichier Non compressé. format:

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

La commande ci-dessus va décompresser nom_fichier.sql.gz en utilisant gzip et extraire la base de données nommée "nombase" de "nomfichier.sql.gz" & stockez-la en tant que SQL simple. out/nombase.sql

9) Extrayez toutes les tables de mysqldump dans un dossier différent:

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

La commande ci-dessus va extraire toutes les tables du "nom de fichier" spécifié mysqldump file et extrait les tableaux au format compressé en fichier individuel fichiers, nom-table.sql.gz stockés sous/chemin/vers/extraits /. Le scénario créera le dossier/chemin/vers/extraits/s'il n'existe pas.

10) Extraire une ou plusieurs tables d'une base de données dans un vidage complet:

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

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

Extrayez toutes les tables 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 va extraire tbl1 et tbl2 de la base de données DBNAME dans Format SQL sous le dossier "out" dans le répertoire en cours.

Vous pouvez extraire une seule table comme suit:

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

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

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

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

12) Liste le contenu du fichier mysqldump

mysqldumpsplitter.sh --source filename --desc

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

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

  • De plus, une fois que vous extrayez une seule table que vous croyez toujours plus grande, vous pouvez utiliser la commande linux split avec le nombre de lignes pour fractionner davantage le dump .split -l 10000 filename.sql

  • Cela dit, si tel est votre besoin (à venir plus souvent), vous pouvez envisager d’utiliser mydumper , qui crée en fait des vidages individuels que vous n’avez pas besoin de séparer!

4
mysql_user

Vous n’avez pas besoin d’un accès ssh à l’un de vos serveurs. Juste un client mysql [dump] est correct . Avec le mysql [dump], vous pouvez dump votre base de données et l’importer à nouveau.

Sur votre PC, vous pouvez faire quelque chose comme:

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

et tu as fini. :-)

j'espère que cela t'aides

2
user185696

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 à fractionner les données dans les tables les plus grandes.

1
skoob

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

J'aime particulièrement la méthode interactive; vous pouvez diviser un fichier volumineux dans Eclipse. J'ai essayé avec succès un fichier 105GB dans Windows:

Ajoutez simplement la bibliothèque MySQLDumpSplitter à votre projet: http://dl.bintray.com/verace/MySQLDumpSplitter/jar/

Petite note sur la manière 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
Alisa

je recommanderais l'utilitaire bigdump, vous pouvez le récupérer ici. http://www.ozerov.de/bigdump.php Cela échelonne l'exécution du dump, aussi près que possible de votre limite, en exécutant des lignes complètes à la fois.

1
LittleT15

Découvrez SQLDumpSplitter 2, je viens de l'utiliser pour scinder avec succès un cliché de 40 Mo. Vous pouvez l'obtenir au lien ci-dessous: 

sqldumpsplitter.com

J'espère que cette aide. 

0
direct

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
gadelkareem

Vous pouvez diviser un fichier existant par AWK. C'est très simple et rapide

Séparons table dump 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 fractionner le vidage par 'base de données'

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

Essayez ceci: https://github.com/shenli/mysqldump-hugetable Il produira 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 dans env.sh.

0
shenli3514

J'ai écrit une nouvelle version de SQLDumpSplitter, cette fois-ci avec un analyseur approprié, permettant de diviser des fichiers tels que des INSERT avec beaucoup de valeurs sur des fichiers. C'est maintenant multi-plateforme: https://philiplb.de/sqldumpsplitter3/

0
Philip

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

0
jj33

J'ai créé MySQLDumpSplitter.Java qui, contrairement aux scripts bash, fonctionne sous Windows. C'est Disponible ici https://github.com/Verace/MySQLDumpSplitter .

0
Vérace