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.
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
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
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.
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
J'ai récemment créé sqlsplit.com . Essaye le.
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!
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
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.
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.
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.
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:
J'espère que cette aide.
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
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}';
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.
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/
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).
J'ai créé MySQLDumpSplitter.Java qui, contrairement aux scripts bash, fonctionne sous Windows. C'est Disponible ici https://github.com/Verace/MySQLDumpSplitter .