Script Bash pour la sauvegarde automatique des bases de données MySQL sous Debian 5.
Bonjour à tous,
Récemment j'ai été amené à développer un petit script Bash qui permet la sauvegarde de base de données MySQL de manière automatisée.
Ceci aura pour but, de sauvegarder vos bases dans un répertoire, en y ajoutant le timestamp. Pour limiter le place prise par le stockage des différents exports, j'ai volontairement inclus une gestion de suppression des fichiers datant de plus de X jours.
Ci-dessous, vous retrouvez le script en question, ou directement ici dans sa version téléchargeable.
#!/bin/bash # # Backup des bases de donnees MySQL # 2011 06 14 # Version 1.2 # # Mickael ALLAIN # # http://www.mickael-allain.fr # allain.mickael@gmail.com ######################################### # HISTORIQUE DES VERSIONS ######################################### # 1.2 2011 06 14 # Ajout d une fonction permettant l affichage a l ecran + fichier de LOG (fonction redirectLog) # Ajout de la possibilite de configurer le format de l horodatage de l export SQL (Variable FORMAT_DATE) # Ajout de la possibilite de definir le repertoire de LOG de maniere absolue (precedemment c etait en mode relatif) # Ajout d exemples de configuration avant les variables # Correction de la methode "find" qui recherchait les fichiers SQL a supprimer datant de MTIME # 1.1 2011 06 06 # Ajout des logs # Ajout de tests de presence de repertoires + binaires # 1.0 2010 02 12 # Première version ######################################### # CONFIGURATION ######################################### #***********************************# # PARTIE CONFIGURABLE # #***********************************# # Identification de la base USER='myUser' PASSWORD='myPassword' # Definition du repertoire racine # ex : /mon/repertoire/export/sql ROOT_DIRECTORY='/mes/exports/sql' # Localisation de l outil mysqldump # ex : /usr/bin/mysqldump PATH_MYSQLDUMP='/usr/bin/mysqldump' # Definition du repertoire log # ex : /le/repertoire/content/mes/logs LOG_PREFIX_DIRECTORY='/mes/fichiers/logs' # Definition du nom de fichier contenant les logs # ex : dump_databases.log LOG_FILENAME='dump_databases.log' # Persistance des sauvegardes en nombres de jours # ex : 30 MTIME=30 # Type de produits # ex : PRODUCTS[0]='base1' # ex : PRODUCTS[1]='base2' PRODUCTS[0]='base1' PRODUCTS[1]='base2' # Variable code retour # ex : OK=0 # ex : ERR=3 OK=0 ERR=3 # Format de l horodatage des fichiers SQL # ex : %Y%m%d_%H%M%S # a pour horodatage le fichier sql : mabase_20110614_222509.sql FORMAT_DATE='%Y%m%d_%H%M%S' #**********************************************# # FIN DE LA PARTIE CONFIGURABLE # #**********************************************# ######################################### # CONFIGURATION GLOBALE ######################################### # Variable globale concernant le repertoire cible des dumps TARGET_PATH=${ROOT_DIRECTORY} # Variable globale concernant les LOGS LOG_DIRECTORY=${LOG_PREFIX_DIRECTORY} LOG_PATH=${LOG_DIRECTORY}/${LOG_FILENAME} # Recuperation du datetime courant CUR_DATE=`date +$FORMAT_DATE` ######################################### ######################################### # FONCTIONS ######################################### # Fonction redirectLog v_message [v_type] # v_message : Message a afficher / sauvegarder # v_type (optionnel) : Type de message a traiter # 0 : Afficher le message sur STDOUT et envoyer le message dans le fichier de LOG (mode par defaut) # 1 : Afficher uniquement le message sur STDOUT # 2 : Afficher uniquement le message dans le fichier de LOG function redirectLog { ######################## # Variables globales de la fonction # ######################## # Definition des codes retours de la fonction E_PARAM_ERR=250 E_OK=0 # Definition du VTYPE par defaut DEFAULT_VTYPE=0 ############################# # Traitement des parametres de la fonction # ############################# # Si le parametre obligatoire v_message n est pas present if [ -z "$1" ] then # Sortie du programme echo "[ERR] Erreur lors de l appel de la fonction redirectLog" exit $E_PARAM_ERR fi # Recuperation du parametre obligatoire v_message VMESSAGE=$1 # Test si presence du parametre v_type (optionnel) if [ -z "$2" ] then # Application du VTYPE par defaut VTYPE=$DEFAULT_VTYPE else # Recuperation du parametre v_type VTYPE=$2 fi ############################## # Traitement suivant le type de sortie VTYPE # ############################## # Suivant le type de sortie definie par l argument VTYPE case $VTYPE in 0) # Affichage sur STDOUT + LOG echo "$VMESSAGE" echo "$VMESSAGE" >> ${LOG_PATH} ;; 1) # Affichage uniquement sur STDOUT echo "$VMESSAGE" ;; 2) # Affichage uniquement dans la LOG echo "$VMESSAGE" >> ${LOG_PATH} ;; esac } ######################################### ######################################### # TEST ARBORESCENCE / BINAIRES ######################################### # Test presence du TARGET_PATH if [ ! -d $TARGET_PATH ] then redirectLog "Le repertoire $ROOT_DIRECTORY n est pas present" 1 redirectLog "[CODE_RETOUR] $ERR" 1 exit $ERR fi # Test presence du LOG_DIRECTORY if [ ! -d $LOG_DIRECTORY ] then redirectLog "Le repertoire $LOG_DIRECTORY n est pas present" 1 redirectLog "[CODE_RETOUR] $ERR" 1 exit $ERR fi # Test presence du LOG_DIRECTORY if [ ! -f $PATH_MYSQLDUMP ] then redirectLog "Le binaire $PATH_MYSQLDUMP n est pas present" 1 redirectLog "sudo apt-get install mysql-server ?" 1 redirectLog "[CODE_RETOUR] $ERR" 1 exit $ERR fi ######################################### # Initialisation du fichier de LOG redirectLog "####################################" redirectLog "#### BACKUP BDD $CUR_DATE ####" ######################################### # Exportation des bases de donnees # Suppression des sauvegardes datant de plus de ${MTIME} jours find ${TARGET_PATH} -name "*.sql" -mtime ${MTIME} -delete # Pour chaque produit specifie en variable globale for PRODUCT in ${PRODUCTS[*]} do # Info LOG redirectLog "[INFO] Tentative d export de la base '$PRODUCT' vers '${TARGET_PATH}/${PRODUCT}_${CUR_DATE}.sql'" # Dump de la base specifie suivant le produit et sa version "$PATH_MYSQLDUMP" -u "${USER}" -p"${PASSWORD}" ${PRODUCT} > ${TARGET_PATH}/${PRODUCT}_${CUR_DATE}.sql 2>> ${LOG_PATH} # Test du code retour if [ $? -ne 0 ] then redirectLog "[ERR] Echec de l export de la base '$PRODUCT'" redirectLog "[CODE_RETOUR] $ERR" redirectLog "####################################" redirectLog "LOG : $LOG_PATH" 1 exit $ERR else redirectLog "[INFO] Export de la base '$PRODUCT' [OK]" fi done # Cloture du fichier LOG redirectLog "[CODE_RETOUR] $OK" redirectLog "####################################" # Code retour OK exit $OK
Configuration de mon script dans mon environnement.
Plusieurs choses avant de lancer le script en production. Vous allez devoir configurer, vos identifiants, votre répertoire cible ainsi que les bases à sauvegarder. (Et oui, il faut "bosser" un peu quand même !)
Identifiant de connexion
Il va falloir configurer l'identification à la base de données en modifiant l'utilisateur et le mot de passe.
USER=myuser PASSWORD=mypassword
Ce compte aura bien sûr le droit de se connecter sur les bases à exporter (sinon, ça va être embêtant)
Répertoire cible
Pour exporter la base de données, il faudra au préalable créer le répertoire de destination, avec les droits de lecture et d'écriture par l'utilisateur qui va exécuter le script.
# Definition du repertoire racine ROOT_DIRECTORY='/var/export_sql'
Persistance des exports
Mon script inclus en effet une gestion des précédents exports. Avoir des exports de bases datant de plus de 150 jours, peut être intéressant pour certains, mais inutile pour d'autres. A vous de choisir. Cette option est modifiable via la variable MTIME.
# Persistance des sauvegardes en nombres de jours MTIME=30
Spécification des bases à exporter
Et oui, il faut bien sûr spécifier les bases à exporter. Vous pouvez le faire via la variable PRODUCTS.
# Type de produits PRODUCTS[0]='base1' PRODUCTS[1]='base2'
Ordonnancement des sauvegardes
Une fois que vous avez défini l'utilisateur système qui va exécuter ce script, il vous suffit d'ajouter cette tâche dans un traitement cron, permettant ainsi de répéter la tâche plusieurs fois par jours si vous le souhaitez.
Avec votre utilisateur système, éditons notre crontab
user@local:~$crontab -e
Dans l'exemple ci-dessous, je lance une sauvegarde tous les jours à 00H.
0 0 * * * /home/user/scripts/backupmysql.sh
Voilà, en espérant que ce script vous servira ;-)
Bonne journée à tous.
Mickaël.