web-dev-qa-db-fra.com

Mysqldump uniquement les tables avec certains caractères génériques préfixe/Mysqldump?

J'ai cette énorme base de données en désordre que je nettoie. Il contient plus de 500 tables, résultat de la combinaison de Magento Enterprise et de Joomla dans une seule base de données.

Pour aggraver les choses, il existe un ensemble de plus de 70 tables Joomla qui ne sont pas utilisées du tout. Ceux-ci sont tous préfixés avec bak_.

Simplement supprimer ces tables bak_ sera facile, mais je veux tout d'abord les «commencer» (voyez ce que j'ai fait là-bas?). 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 faire cela? Merci!

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

70
thaddeusmt

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

Vous pouvez également utiliser --ignore-table si ce serait plus court.

Une autre idée est de placer 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 

Éditez le fichier et obtenez toutes les bases de données sur une seule ligne. Alors fais 

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

Pour supprimer des tables sur une 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 {}"
98
sreimer

Voici un moyen facile:

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

Mon préféré:

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

Toutes les réponses suivent presque la même approche, mais c'est la syntaxe la plus concise.

46
Stephen M. Harris

Un autre outil pour extraire la liste des noms de tables avec mysql -sN …, puis utiliser chaque élément dans une boucle de shell "pour… dans…"

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, si elles sont assez courtes:

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


Même principe, mais pour vider toutes les tables sauf celles commençant 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
2
eleg

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 créé un vidage de table par le masque comme% mask% de la base de données vers un seul fichier . Espérons que quelqu'un le trouvera utile.

2
Andrey Verbitskiy

Depuis MySQL 5.7, l'outil mysqlpump prend en charge le filtrage des noms de table avec des modèles.

Notez que c’est un outil à moitié cuit, vous devez donc vous assurer qu’il prend en charge les fonctionnalités requises et qu’il le fait correctement (par exemple, à partir de MySQL 5.7.12, l’exportation des triggers est interrompue).

2
Marcus

En me basant sur certaines des autres réponses de Nice ici, j'ai créé le script Shell pour rendre cela encore plus facile. Ce script génère 3 fichiers dans la sortie: un avec la structure de toutes les tables, un avec les données de toutes les tables non exclues et un avec les données de toutes les tables "exclues" (vous pouvez commenter cela si vous ne le faites pas vraiment). t besoin Ensuite, vous pouvez utiliser le (s) type (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
1
dtbarne

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'`
0
user3453061

mysql DATABASE -u USERNAME -p -e 'affiche des tables comme "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql

0
bhrached