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?

30
demandé sur Trevor 2009-11-19 19:02:48

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.

38
répondu Cfreak 2014-04-21 08:55:54

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

6
répondu 0xC0000022L 2011-04-03 15:30:31

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.

0
répondu stask 2009-11-19 16:11:54

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.

0
répondu Mycenae 2016-02-25 01:26:19

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`'
0
répondu Eduardo Cuomo 2016-11-04 13:33:16