Formation PUB200 : MySQL, 2018 Copie de sécurité d'une base de données MySQL

3.4 Script pour exporter l'ensemble des bases de données MySQL


Si votre serveur de bases de données venait à faire défaut, vos précieuses bases de données seraient perdues.

C'est pourquoi il est important d'avoir en tout temps une sauvegarde récente de toutes les bases de données qu'il contient.

Toutes les bases de données dans un seul fichier SQL

La commande mysqldump permet de générer un script SQL qui pourra recréer une base de données et tout ce qu'elle contient : ses données, ses index, ses procédures et fonctions stockées, etc.

Avec l'option --all-databases, il est possible de générer d'un seul coup les requêtes SQL qui permettent de recréer TOUTES les bases de données présentes sur le serveur MySQL.

Toutes ces requêtes seront contenues dans un seul et même fichier SQL.

MySQL

mysqldump -u root -p --default-character-set=utf8 --routines --comments --triggers --all-databases > ToutesBDMySQL.sql

Un fichier SQL par base de données avec mysqldump-secure

Si vous avez accès à l'outil mysqldump-secure, un simple appel à ce script créera une script SQL pour chacune de vos bases de données.

Cet outil est installé par défaut sous Devilbox.

Voici comment l'utiliser dans cet environnement.

  • Accédez au terminal de votre conteneur PHP. Si vous ne connaissez pas le nom du conteneur, lancez la commande docker ps. Le nom des conteneurs apparaîtra dans la dernière colonne.
    Terminal de l'ordinateur

    docker exec -it devilbox-php-1 bash

  • Lancez la commande :
    Terminal du conteneur PHP

    mysqldump-secure

Ces deux opérations peuvent être combinées en une seule commande qui pourra être copiée dans un fichier bash pour faciliter son utilisation.

Fichier bash

docker exec -it devilbox-php-1 bash -c 'mysqldump-secure'

Résultat à l'écran

[INFO] (OPT): Logging enabled
[INFO] (OPT): MySQL SSL connection disabled
[INFO] (OPT): Compression enabled
[INFO] (OPT): Encryption disabled
[INFO] (OPT): Deletion disabled
[INFO] (OPT): Nagios log disabled
[INFO] (OPT): Info files enabled
[INFO] (SQL): 1/13 Dumping: premierebd (236.44 MB) 6 sec (23.14 MB)
[INFO] (SQL): 2/13 Dumping: deuxiemebd (2.22 MB) 1 sec (0.33 MB)
[INFO] (SQL): 3/13 Skipping: information_schema (DB is ignored)
[INFO] (SQL): 4/13 Dumping: troisiemebd (1.92 MB) 0 sec (0.08 MB)
[INFO] (SQL): 5/13 Dumping: quatriemebd (0.02 MB) 0 sec (0.00 MB)
[INFO] (SQL): 6/13 Dumping: mysql (12.80 MB) 1 sec (0.99 MB)
[INFO] (SQL): 7/13 Dumping: cinquiemebd (0.20 MB) 0 sec (0.00 MB)
[INFO] (SQL): 8/13 Skipping: performance_schema (DB is ignored)
[INFO] (SQL): 9/13 Dumping: sixiemebd (48.28 MB) 3 sec (5.50 MB)
[INFO] (SQL): 10/13 Dumping: septiemebd (60.08 MB) 4 sec (6.18 MB)
[INFO] (SQL): 11/13 Dumping: huitiemebd (70.08 MB) 4 sec (6.51 MB)
[INFO] (SQL): 12/13 Dumping: deuviemebd (74.14 MB) 4 sec (7.83 MB)
[INFO] (SQL): 13/13 Dumping: dixiemebd (69.12 MB) 4 sec (7.11 MB)
[OK] Finished successfully

Les fichiers SQL sont créés dans un volume synchronisé avec votre poste local donc ils demeureront disponibles même si les conteneurs et les volumes étaient détruits.

Sur votre poste de travail, vous les trouverez dans le dossier devilbox/backups/mysql.

Pour chaque base de données, deux fichiers sont créés :

  • Un script SQL compressé dont le nom est au format aaaa-mm-jj-hh-mm-ss__nombd.sql.gz.
  • Si la génération du script SQL a fonctionné, les détails sur la création de ce script sont consignés dans un fichier dont le nom est au format aaaa-mm-jj-hh-mm-ss__nombd.sql.gz.info.

Sauvegarde à l'aide d'un script maison

Si vous n'avez pas accès à mysqldump-secure ou si vous souhaitez travailler avec votre propre script pour sauvegarder vos bases de données, vous pouvez utiliser utiliser une astuce1 qui consiste à boucler dans les résultats d'une requête qui affiche le nom de chaque base de données.

Je vous propose ce petit script qui permet d'y arriver. Il peut être utilisé tel quel sous Mac. Si vous travaillez sous Windows, quelques petits ajustements seront nécessaires, tel que présenté plus bas.

En prime, je vous propose également les ajustements nécessaires si vous travaillez sous Devilbox.

Notez que sous Mac, si le fichier porte l'extension .bash ou .sh, il sera possible de l'exécuter seulement à partir d'une fenêtre Terminal (ne pas oublier de mettre « ./ » avant d'écrire son nom lors de l'appel). S'il porte l'extension .command, il sera possible de l'exécuter également en double-cliquant sur son nom dans le Finder.

Toujours sous Mac, vous devez ajouter les droits d'exécution sur ce fichier (voir Exécuter un fichier bash).

Fichier bash

#!/bin/bash

# Génère des scripts SQL qui permettent de recréer chacune des bases de données, en ajoutant la date du jour au nom de chaque script.
# Programmé par Christiane Lagacé : https://christianelagace.com
# Le 29 mars 2015
# Dernier ajustement par Christiane Lagacé
# Le 9 septembre 2022
# Modifications : Version qui génère un fichier SQL pour chacune des bases de données.

# *************************
# ***** Configuration *****
# *************************

# ***** VOUS DEVEZ REMPLIR CETTE SECTION *****

# Requis seulement si le serveur de bases de données est installé directement sur votre ordinateur (pas dans un conteneur)
# Chemin du dossier qui contient le fichier mysqldump.exe
# (ex : "/Applications/AMPPS/mysql/bin" ou /Applications/XAMPP/xamppfiles/bin)
cheminMySQLBin="/Applications/AMPPS/mysql/bin"

# Requis seulement si le serveur de bases de données est installé dans un conteneur
# Nom du conteneur MySQL (docker ps permet de lister les conteneurs)
# (ex : devilbox-mysql-1)
conteneur=devilbox-mysql-1

# Nom de l'usager MySQL qui détient les droit requis pour sauvegarder les bases de données
usagerMySQL=root

# Chemin du dossier dans lequel le ou les scripts seront sauvegardés
# (ex : ~/sauvegarde ou /Users/monnom/Documents/sauvegarde)
# (ex sous Windows : C:\\Users\\monnom\\Documents\\sauvegarde)
cheminCible=~/sauvegarde


# *****************************
# ***** Fin configuration *****
# *****************************

# ***** Date du jour *****
aujourdhui=$(date +%Y-%m-%d)

echo "**********************************************************************"
echo "***** Création des scripts SQL pour recréer chacune des BD MySQL *****"
echo "**********************************************************************"
if $cheminMySQLBin/mysql -u root -p -N -e "show databases" | while read bd; do mysqldump --default-character-set=utf8 --routines --comments --triggers --single-transaction "$bd" >$cheminCible/"$bd"-$aujourdhui.sql; done
then
    echo "Les scripts ont été générés dans le dossier $cheminCible."
else
    echo "OUPS! Un problème a été rencontré."
fi

Ajustements pour Devilbox

Dans le cas où votre serveur MySQL est dans un conteneur Docker monté avec Devilbox, vous devez apporter quelques modifications au fichier original afin que votre ordinateur puisse lancer une commande dans le conteneur.

La variable cheminMySQLBin ne sera plus utile alors vous pouvez la mettre en commentaire.

Remplacez la partie du bas par ceci :

Fichier bash
echo "**********************************************************************"
echo "***** Création des scripts SQL pour recréer chacune des BD MySQL *****"
echo "************************** Version Devilbox **************************"
echo "**********************************************************************"

basesdedonnees=$(docker exec $conteneur bash -c "/usr/bin/mysql -N -e 'show databases'")
echo "Bases de données découvertes :"
echo $basesdedonnees
echo

for bd in $basesdedonnees
do
    echo "Génération du script SQL pour $bd"
    docker exec -it -e bd=$bd -e aujourdhui=$aujourdhui $conteneur bash -c '/usr/bin/mysqldump --default-character-set=utf8 --routines --comments --triggers --single-transaction ${bd} > /home/${bd}-${aujourdhui}.sql'
done

docker cp $conteneur:/home/. ${cheminCible}
echo
echo "Les scripts ont été générés dans le dossier $cheminCible."

Ajustements pour Windows

Ce script pourra rouler sous Windows si vous avez installé WSL 2.

Vous devrez apporter quelques ajustements au script.

  • La variable cheminCible devra faire référence à un dossier sous Windows. Les barres obliques inverses devront être doublées. Ex : C:\\Users\\monnom\\Documents\\sauvegarde.
  • Les caractères de fin de ligne devront être ajustés pour le monde Linux. Sous Geany : Document / Définir les fins de ligne / Convertir en LF (Unix).
  • Dans la version pour Devilbox, à chaque fois que la commande docker est utilisée, vous devrez plutôt écrire docker.exe.
  • Pour lancer le script, vous devrez précéder son nom par bash et ne pas oublier l'extension, peu importe si c'est .sh, .bash ou .command.
    Fenêtre de commande

    bash nomfichier.bash

Source

1. « MySQL Back-up: Take a mysqldump with each database in its own SQL File ». Mattias Geniar. https://ma.ttias.be/mysql-back-up-take-a-mysqldump-with-each-database-in-its-own-sql-file/

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre