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.
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
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
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
où 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.
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
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!
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
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.
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.
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.
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).
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
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:
Espérons que cette aide.
j'ai créé MySQLDumpSplitter.java qui, contrairement aux scripts bash, fonctionne sur Windows. C'est disponible ici https://github.com/Verace/MySQLDumpSplitter .
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}';
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.