Question

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 relancer 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 de mysqldump suggérée par la première affiche donne un fichier .sql qui peut ensuite être fractionné 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, donc j’avais besoin de savoir combien de lignes de code SQL correspondaient à environ 40 Mo.

Était-ce utile?

La solution

Commencez par vider le schéma (il tient certainement dans 2 Mo, non?)

mysqldump -d --all-databases 

et le restaurer.

Ne dumpez ensuite que les données dans des instructions d’insertion distinctes afin de 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

Autres conseils

Ce script bash divise un fichier de vidage d'une base de données en fichiers séparés pour chaque table et 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 " <*> DUMP_FILE"
        echo "extract one table:"
        echo " <*> 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

d'après https://gist.github.com/jasny/1608062
et https://stackoverflow.com/a/16840625/1069083

\x60' -f2` cat head $FILE foot > "$NAME.sql" done rm head foot table*

d'après https://gist.github.com/jasny/1608062
et https://stackoverflow.com/a/16840625/1069083

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 sauvegarde 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

Ceci créera un fichier gzip pour chaque table.

Utilisez l'option --tab pour diviser la sortie de mysqldump en fichiers séparés.

mysqldump [connecting options] --tab=directory_name dbname 

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 pas sûr si phpMyAdmin peut gérer ces fichiers avec votre restriction particulière, cependant.

Réponse tardive, mais recherchant la même solution et rencontrant le code suivant, situé sous le 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

Il existe cet excellent mysqldumpsplitter script qui contient une tonne d’options pour extraire-de-mysqldump.

Je copierais la recette ici pour choisir votre cas de:

  

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

     

sh mysqldumpsplitter.sh --source nomdefichier --extract DB --match_str   nom de la base de données

     

La commande ci-dessus créera SQL pour la base de données spécifiée à partir de   "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 nomdefichier --extract TABLE --match_str   nom de table

     

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

     

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

     

sh mysqldumpsplitter.sh --source nomfichier - extraire REGEXP   --match_str expression régulière

     

La commande ci-dessus créera des fichiers sqls pour les tables correspondant aux valeurs standard spécifiées.   expression à partir de " nom de fichier " spécifié fichier mysqldump 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 - nom du fichier source - extraire ALLDBS

     

La commande ci-dessus va extraire toutes les bases de données à partir du "nom de fichier" spécifié.   le fichier mysqldump et le stocker au format compressé   nom-base-données.sql.gz.

     

5) Extrayez toutes les tables de mysqldump:

     

sh mysqldumpsplitter.sh - nom du fichier source - extraire ALLTABLES

     

La commande ci-dessus va extraire toutes les tables des "noms de fichiers" spécifiés.   le fichier mysqldump et le stocker au format compressé   nom-table.sql.gz.

     

6) Extraire la liste des tables de mysqldump:

     

sh mysqldumpsplitter.sh --source nomfichier - extraire REGEXP   --match_str '(table1 | table2 | table3)'

     

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

     

7) Extrayez une base de données depuis mysqldump compressé:

     

sh mysqldumpsplitter.sh --source nomfichier.sql.gz --extract DB   --match_str 'nombase' --decompression gzip

     

La commande ci-dessus décompressera filename.sql.gz en utilisant gzip, extrait   base de données nommée " nombase " à partir de "filename.sql.gz" & amp; stocker comme   out / nombase.sql.gz

     

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

     

sh mysqldumpsplitter.sh --source nomfichier.sql.gz --extract DB   --match_str 'nombase' --decompression gzip --compression aucune

     

La commande ci-dessus décompressera filename.sql.gz en utilisant gzip et extraira   base de données nommée " nombase " à partir de "filename.sql.gz" & amp; stocker comme plaine SQL   out / nombase.sql

     

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

     

sh mysqldumpsplitter.sh --source nomfichier - extraire ALLTABLES   --output_dir / path / to / extraits /

     

La commande ci-dessus va extraire toutes les tables des "noms de fichiers" spécifiés.   mysqldump file et extrait les tableaux au format compressé sur   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) Extrayez 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 souhaitez   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 aucune

     

Extraire 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 nomdefichier --extract DBTABLE   --match_str "DBNAME. (tbl1 | tbl2)" --compression aucune

     

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 nomdefichier --extract DBTABLE   --match_str "DBNAME. (tbl1)" --compression aucune

     

11) Extrayez toutes les tables d'une base de données spécifique:

     

mysqldumpsplitter.sh --source nomdefichier --extract DBTABLE --match_str   " DBNAME. * " --compression aucune

     

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

     

12) Liste le contenu du fichier mysqldump

     

mysqldumpsplitter.sh --source nomdefichier --desc

     

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

Vous pourrez 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 pensez encore 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 réellement des dumps individuels que vous n’avez pas besoin de séparer!

J'ai récemment créé sqlsplit.com . Essayez-le.

Vous n’avez pas besoin d’un accès ssh à 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.

Sur 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 cela aide

Vous pouvez vider des tables individuelles avec mysqldump en exécutant la base de données mysqldump 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.

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 entières à la fois.

Une précision 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 de 105 Go sous Windows:

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

Remarque 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.

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

This 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

Découvrez SQLDumpSplitter 2, je viens de l’utiliser pour fractionner un cliché de 40 Mo avec succès. Vous pouvez l'obtenir en cliquant sur le lien ci-dessous:

sqldumpsplitter.com

J'espère que cette aide.

J'ai créé MySQLDumpSplitter.java qui, contrairement aux scripts bash, fonctionne sous Windows. Ses disponible ici https://github.com/Verace/MySQLDumpSplitter .

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

Fractionnons le vidage de la table 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}';

Essayez ceci: https://github.com/shenli/mysqldump-hugetable Il va vider les 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.

J'ai écrit une nouvelle version de SQLDumpSplitter, cette fois-ci avec un analyseur syntaxique approprié, permettant de séparer des fichiers tels que des INSERT comportant de nombreuses valeurs. La solution est maintenant multi-plateforme: https://philiplb.de/sqldumpsplitter3/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top