Astuce MySQL/MariaDB : Réaliser un dump de toutes les bases de données disposant d'un préfixe identique
Aujourd'hui, j'ai eu besoin d'exporter toutes les bases de données MariaDB d'un projet. Le de nom des bases de données de ce projet est préfixé afin de les retrouver rapidement.
J'ai donc tester de faire un export avec le caractère * pour essayer de récupérer uniquement ces bases.
mysqldump --databases "skymac_*" > skymac_dbs.sql
Malheureusement, le résultat obtenu n'est pas celui attendu. J'ai obtenu l'erreur :
mysqldump: Got error: 1049: "Unknown database 'skymac_*'" when selecting the database
Visiblement, l'outil mysqldump ne support pas les caractères "wildcard" pour déterminer les bases de données à récupérer.
Il a fallut que je trouve une solution.
Bien sur, nous pourrions faire un export de toutes les bases de données et faire le tri ensuite, mais cela n'est pas très optimal.
La bonne solution serait d'obtenir de la part de MariaDB, la liste des bases de données à exporter puisque c'est lui qui les connait. Puis de la fournir à mysqldump.
Cela se fait tout simplement, en demandant à la commande mysql d'exécuter une commande, basée sur SHOW DATABASES afin d'obtenir la liste souhaitée.
mysql -e "SHOW DATABASES LIKE 'skymac_%';"
Le résultat est
+----------------------+
| Database (skymac_%) |
+----------------------+
| skymac_main |
| skymac_pr1 |
| skymac_pr2 |
Cela correspond bien à ce que l'on veut, il faut désormais le rendre lisible par mysqldump. Il suffit d'ajouter, à la commande, les paramètres -B et -N
mysql -BN -e "SHOW DATABASES LIKE 'skymac_%';"
Et hop, voilà quelque chose de parfaitement exploitable
skymac_main
skymac_pr1
skymac_pr2
Le paramètre -B renvoie le résultat en mode batch, donc sans le formatage "boite" de mysql. Tandis que le paramètre -N retire l'en-tête.
Il n'y a plus qu'à combiner l'ensemble, avec la commande mysqldump telle que
mysqldump --databases `mysql -BN -e "SHOW DATABASES LIKE 'skymac_%';"` > skymac_dbs.sql
Attention, si vous utilisez sudo pour accéder aux bases en tant que root, il faudra l'ajouter 2 fois
sudo mysqldump --databases `sudo mysql -BN -e "SHOW DATABASES LIKE 'skymac_%';"` > skymac_dbs.sql
Enfin, cela fonctionne aussi avec les suffixes évidemment. Il est même possible de combiner les deux, voir de faire une recherche complètement différente sur le nom des bases.