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.
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 {}"
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]
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.
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
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.
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).
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
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'`
mysql DATABASE -u USERNAME -p -e 'affiche des tables comme "PREFIX%"' | grep -v Tables_in | xargs mysqldump DATABASE -u USERNAME -p> DUMP.sql