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.

2voto

eleg Points 11

Un autre oneliner pour extraire la liste des noms de tables avec mysql -sN … et ensuite utiliser chaque élément dans une boucle shell "for in " pour les déposer :

for f in `mysql dbname -sN -e "SHOW TABLES LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

ou (version étendue)

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND TABLE_NAME LIKE 'bak\_%' "` ; do mysql dbname -rsN -e "DROP TABLE $f"; done

Ou utilisez "group_concat" pour concaténer* les noms des tables, s'ils sont suffisamment courts :

tables=`mysql dbname -srN -e "SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR ',') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'  AND TABLE_NAME LIKE 'bak\_%' "`; mysql dbname -rsN -e "DROP TABLE $tables"

*certaines limites comme la valeur de "group_concat_max_len" (typiquement égale à 1024, cf vos 70 tables) peuvent interférer.


Même principe, mais pour vider toutes les tables sauf celles qui commencent par "bak_" :

for f in `mysql dbname -sN -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname' AND NOT(TABLE_NAME LIKE 'bak\_%') "` ; do mysqldump -u [u] -p dbname "$f" >> dump_dbname.sql; done

2voto

Marcus Points 536

À partir de MySQL 5.7, l'option mysqlpump prend en charge le filtrage des noms de table à l'aide de modèles.

Notez qu'il s'agit d'un outil semi-fini, vous devez donc vous assurer qu'il prend en charge les fonctionnalités requises et qu'il les exécute correctement (par exemple, à partir de MySQL 5.7.12, l'exportation des triggers ne fonctionne plus).

1voto

dtbarne Points 4066

En m'appuyant sur d'autres réponses sympathiques ici, j'ai créé le shell script pour rendre cela encore plus facile. Ce script génère 3 fichiers dans la sortie - un avec la structure pour toutes les tables, un avec les données pour toutes les tables non exclues, et un avec les données pour toutes les tables "exclues" (vous pourriez commenter ceci si vous n'en avez vraiment pas besoin). Vous pouvez ensuite utiliser celle(s) dont vous avez besoin.

#!/bin/bash

echo -n "DB Password: "
read -s PASSWORD

HOST=yourhostname.com
USER=youruser
DATABASE=yourdatabase

MAIN_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES WHERE Tables_in_dashboard NOT LIKE 'bigtable_%';")
STATS_TABLES=$(mysql -h $HOST -u $USER -p$PASSWORD -D $DATABASE -Bse "SHOW TABLES LIKE 'bigtable_%';")

echo "Dumping structure..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-data | gzip > structure.sql.gz

echo "Dumping main data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $MAIN_TABLES | gzip > data.sql.gz

echo "Dumping big table data..."
mysqldump -h $HOST -u $USER -p$PASSWORD $DATABASE --no-create-info $STATS_TABLES | gzip > big_table_data.sql.gz

0voto

user3453061 Points 1

Ma solution :

mysqldump -u username -p mydatabase `mysql -B --disable-column-names -u username -p mydatabase -e "SHOW TABLES LIKE 'bak\_%'" | sed ':a;N;$!ba;s/\n/ /g'`

0voto

bhrached Points 127
mysql DATABASE -u USERNAME -p -e 'show tables like "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p > DUMP.sql

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