Je veux sauvegarder uniquement les vues avec mysqldump.
Est-ce possible?
Si c'est le cas, comment?
NOTE: Cette réponse de Ken est passée de la suggestion de modification à la réponse correspondante.
voici un exemple complet de ligne de commande en utilisant une variante de ce qui précède
mysql -u username INFORMATION_SCHEMA
--skip-column-names --batch
-e "select table_name from tables where table_type = 'VIEW'
and table_schema = 'database'"
| xargs mysqldump -u username database
> views.sql
Cela extrait tous les noms de vue via une requête à la base de données INFORMATION_SCHEMA, puis les dirige vers xargs pour formuler une commande mysqldump. --skip-column-names et --batch sont nécessaires pour rendre la sortie xargs conviviale. Cette ligne de commande risque d’être trop longue si vous avez beaucoup de vues. Dans ce cas, vous voudriez ajouter une sorte de filtre supplémentaire à la sélection (par exemple, rechercher toutes les vues commençant par un caractère donné).
J'ai modifié l'excellente réponse d'Andomar pour permettre à la base de données (et à d'autres paramètres) d'être spécifiée une seule fois:
#!/bin/bash -e
mysql --skip-column-names --batch -e \
"select table_name from information_schema.views \
where table_schema = database()" $* |
xargs --max-args 1 mysqldump $*
Je sauvegarde ceci sous le nom mysql-dump-views.sh
et l’appelle via:
$ mysql-dump-views.sh -u user -ppassword databasename >dumpfile.sql
Il est facile de sauvegarder des vues sur plusieurs bases de données en utilisant simplement information_schema:
mysql --skip-column-names --batch -e 'select CONCAT("DROP TABLE IF EXISTS ", TABLE_SCHEMA, ".", TABLE_NAME, "; CREATE OR REPLACE VIEW ", TABLE_SCHEMA, ".", TABLE_NAME, " AS ", VIEW_DEFINITION, "; ") table_name from information_schema.views'
Par sauvegarde, je suppose que vous entendez simplement la définition sans les données.
Il semble qu'actuellement, mysqldump ne fasse pas la distinction entre les vues et les tables, aussi la meilleure chose à faire est-elle de spécifier explicitement les vues sur la ligne de commande vers mysqldump ou de trouver cette liste de manière dynamique avant mysqldump .
Vous pouvez obtenir toutes les vues dans une base de données spécifique en utilisant cette requête:
SHOW FULL TABLES WHERE table_type='view';
Je me rapprocherais le plus possible de la sortie de mysqldump comme l’a demandé le PO, car elle contient une foule d’informations sur la vue qui ne peut pas être reconstruite avec une simple requête de INFORMATION_SCHEMA.
Voici comment créer un script de vue de déploiement à partir de ma base de données source:
SOURCEDB="my_source_db"
mysql $SOURCEDB --skip-column-names -B -e \
"show full tables where table_type = 'view'" \
| awk '{print $1}' \
| xargs -I {} mysqldump $SOURCEDB {} > views.sql