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.

Vus : 2023
Publié par Mickaël : 9