98 votes

Mysqldump seulement les tables avec un certain préfixe / Mysqldump wildcards ?

J'ai cette énorme base de données désordonnée que je suis en train de nettoyer. Elle abrite plus de 500 tables, ce qui est le résultat de la combinaison de Magento Enterprise et de Joomla dans une seule et même base de données.

Pour aggraver les choses, il existe un ensemble de plus de 70 tables Joomla qui ne sont pas du tout utilisées. Elles sont toutes préfixées par bak_ .

Je supprime juste ces bak_ Les tables seront faciles, mais je veux d'abord les "baker" (voir ce que j'ai fait là ?). Dans mon esprit, je peux imaginer une commande comme celle-ci :

mysqldump -u username -p mydatabase bak_*

Mais ça ne marche pas. Quelle serait la meilleure façon de procéder ? Merci.

EDIT : Oui, je pourrais énumérer explicitement les 70 tables à inclure, ou les ~430 tables à exclure, mais je cherche une meilleure façon de le faire, si possible.

0 votes

La réponse est de sélectionner cette table par requête et de passer cette requête avec mysqldump parce que mysqldump ne supporte pas les regex merci bonne chance

1 votes

Je pense que la réponse à votre question est ici : stackoverflow.com/questions/2949330/

0 votes

La réponse donnée par @minaz est clairement meilleure que la réponse actuellement marquée comme meilleure. Il serait utile de marquer celle-là comme meilleure, si vous êtes d'accord bien sûr.

132voto

sreimer Points 2374

Vous pouvez spécifier les noms de table sur la ligne de commande l'un après l'autre, mais sans caractères génériques. mysqldump databasename table1 table2 table3

Vous pouvez également utiliser --ignore-table si cela pouvait être plus court.

Une autre idée est d'obtenir les tables dans un fichier avec quelque chose comme

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'bak_%'" > tables.txt 

Editez le fichier et mettez toutes les bases de données sur une seule ligne. Ensuite, faites

mysqldump dbname `cat tables.txt` > dump_file.sql

Pour déposer les tableaux en une seule ligne (non recommandé), vous pouvez procéder comme suit

mysql -NB  information_schema -e "select table_name from tables where table_name like 'bak_%'" | xargs -I"{}" mysql dbname -e "DROP TABLE {}"

4 votes

Mais dans tous les cas, je devrai établir une liste de 70 tableaux à ignorer ou de 430 tableaux à inclure. C'est ce que j'essaie d'éviter. J'aurais dû être plus clair dans ma question, mais merci pour la réponse. Cela pourrait fonctionner, oui ;)

1 votes

Une autre idée est d'obtenir les tables dans un fichier avec quelque chose comme mysql -N information_schema -e "select table_name from tables where table_name like 'bak_%'"" > tables.txt Editez le fichier et mettez toutes les bases de données sur une seule ligne. Ensuite, faites mysqldump dbname `cat tables.txt`

0 votes

J'ai fini par laisser tomber les tables bak_, mais je l'ai quand même utilisé pour obtenir la liste des tables. Puis je les ai rassemblées avec des virgules pour créer une grosse instruction DROP TABLE gawk '{print $1"," }' tables.txt > baktables.sql . Merci !

74voto

minaz Points 2473

Voici un moyen simple :

mysql [dbname] -u [username] -p[password] -N -e 'show tables like "bak\_%"' | xargs mysqldump [dbname] -u [username] -p[password] > [dump_file]

4 votes

Il devrait l'être show tables like "<prefix>\_%" parce que _ est également un caractère générique et doit être échappé... sinon vous pourriez avoir un problème avec les tables qui ont le même préfixe-préfixe comme bak_ et bak2_ qui correspondraient toutes les deux sur bak_%

5 votes

Vous pouvez passer -N à mysql et vous n'aurez pas besoin d'exécuter le grep pour filtrer les Tables_in rang.

1 votes

Cela a fonctionné pour moi mais avec mysql -NB.

71voto

smhmic Points 666

Mon préféré :

mysqldump DBNAME $(mysql -D DBNAME -Bse "show tables like 'wp\_%'") > FILENAME.sql

Toutes les réponses adoptent presque la même approche, mais cette syntaxe est la plus concise.

11 votes

Pour ceux qui sont curieux, ces drapeaux sont -B batch -e execute -s silent mode (moins de sortie) dev.mysql.com/doc/refman/5.6/fr/mysql-command-options.html

0 votes

J'adore ça. Je suis revenu ici plusieurs fois pour saisir cet extrait !

1 votes

Léger problème : vous devrez peut-être remplir les paramètres nom d'utilisateur et mot de passe, à la fois pour les commandes mysqldump ET mysql. Et si l'appel à mysql échoue, mysqldump va par défaut vider la base de données entière, ce qui peut être énorme, surtout dans les cas où vous avez tendance à ne vider qu'un sous-ensemble des données.

5voto

Darlinho Points 21

Ce travail pour moi

mysqldump -u USER -p DATABASE $(mysql -u USER -p -D DATABASE -Bse "show tables like 'PREFIX%'") > /tmp/DATABASE.sql

3voto

Andrey Verbitskiy Points 139

Il y a déjà beaucoup de bonnes réponses, mais je suis venu ici avec une telle variation :

mysql MY_DATABASE -N -u MY_MYSQLUSER -p -e 'show tables like "%MY_LIKE_CODE%";' |
xargs mysqldump MY_DATABASE -u MY_MYSQLUSER -p |
gzip > ~/backup/`date +%Y%m%d:::%H:%M:%S-MY_DAMP.sql.gz`

Par cette action j'ai fait un vidage de table par le masque comme %mask%. de la base de données à un seul fichier. J'espère que quelqu'un trouvera cela utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X