mysqldump structure entière mais uniquement les données des tables sélectionnées dans une seule commande
MA base de données a 3 tables: table1, table2 et table3
Je voudrais faire un mysqldump sur cette base de données avec les conditions suivantes:
- Structure de vidage pour toutes les tables
- vider uniquement les données pour table1 et table2, ignorer les données dans table3
Actuellement, je le fais avec 2 instructions mysqldump
mysqldump -u user -p -d db > db_structure.sql
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql
Importez-les dans le même ordre qu'ils ont été vidés (structure, puis données de table1 et table2)
Existe-t-il un moyen de combiner cela en un commande mysqldump unique?
5 réponses
Vous ne pouvez pas les combiner en une seule commande, mais vous pouvez exécuter les deux commandes en même temps et les sortir dans le même fichier.
mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql
Pour éviter d'avoir à entrer le mot de passe deux fois, vous pouvez faire -ppassword
(notez le manque d'espace!). Également utiliser --no-data
dans la première commande ou vous vous retrouvez avec les données. - d n'est pas nécessaire lorsque vous faites une seule base de données.
Étant donné que vous pouvez rediriger la sortie vers une autre commande, comme je l'ai fait, au lieu de simplement rediriger vers un fichier et d'ajouter à ce fichier dans la commande suivante, vous pouvez essayer (modifié à partir de l'exemple de stask):
(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
your_command
... dans mon cas:
(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
gzip -9 > filename.sql.gz
Enfermant les deux commandes mysqldump entre parenthèses crée un sous-shell dont la sortie est redirigée vers gzip, puis redirigée vers un fichier.
PS: j'ai également été incapable de le combiner en une seule invocation mysqldump, bien.
Je ne pense pas que vous pouvez le faire en une seule commande. Mais vous pouvez certainement fusionner la sortie en un seul fichier. Pourquoi ne pas l'envelopper dans un script shell qui suit:
mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql
Vous exécuterez ce script avec deux paramètres: Nom d'utilisateur et mot de passe.
C'est en fait assez simple, utilisez des clauses --where sur les tables où vous ne voulez pas de données et donnez-lui une condition toujours fausse. Par exemple, charger des données sur foo et gah et seulement le schéma sur bar:
mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql
Donc oui, vous pouvez le faire sur une ligne.
Vous pouvez supprimer la partie INSERT INTO ...
:
mysqldump \
--opt \
-u ${DB_USER} -p${DB_PASS} \
${DB_NAME} \
| grep -v 'INSERT INTO `table3`' \
| grep -v 'INSERT INTO `table4`'