Sauvegarde des bases mySql

Avant propos

Le but de l'opération est de réaliser une sauvegarde régulière (dump) de la base de donnée MySQL d'un site Web.

Nous partons du principe que nous avons un accès en ssh sur un serveur tournant sous Linux. Dans le cas contraire, il vous faudra utiliser phpMyadmin pour faire une exportations des bases à la main. Attention toutefois à bien choisir votre format d'encodage (UTF-8 ou ISO Latin1)

Dans cette exemple, il s'agit d'un site Intranet. Mais un site Web “externe” utilisera exactement le même procédé.

Cahier des charges

  • Le site Web se trouve dans le répertoire /home/www/
  • Les fichiers à sauvegarder seront dans /home/www/.sauve/mysql/
  • La base de données MySQL sera sauvegardée chaque jour dans un répertoire du mois en cours
  • Chaque mois, une fichier archive (.tar.gz) sera créé. Il contiendra toutes les archives du mois.

Remarque :
Le lancement du script est assuré automatiquement par une commande cron, lancée chaque jour à 0h00 :

[root@servLin2 ~]# crontab -l
# m h  dom mon dow   command
 
# Sauvegarde de la base de donnee mysql (edit: 06/08/2007)
0 0 * * *      /home/www/.sauve/dump_mysql.sh /dev/null 2>&1

Script

#!/bin/sh
 
# dump_mysql.sh
# Auteur : Janusz <janusz@ledruide.net>
# dates :
#   rev 0 - 06/08/2007
# 
# Sauvegarde de la base MySQL avec archivage mensuel
# 
 
# Données
repSource=/home/www/
repCible=${repSource}.sauve/mysql/
 
clear
cd ${repCible}
 
# Tests et comparaison des dates (roulement répertoires)
aujourdhuiDate=$(date +%y%m%d)
aujourdhuiAnnee=$(date +%Y)
aujourdhuiMois=$(date +%m)
aujourdhuiJour=$(date +%d)
 
repMoisPrecedMois=`expr "${aujourdhuiMois}" - 1`
if [ `expr length ${repMoisPrecedMois}` = 1 ] ; then repMoisPrecedMois=0${repMoisPrecedMois} ; fi
 
repMoisEncours=dump_mysql_${aujourdhuiAnnee}-${aujourdhuiMois}
repMoisPreced=dump_mysql_${aujourdhuiAnnee}-${repMoisPrecedMois}
FichierArchive=mysql_${aujourdhuiDate}.sql
 
 
#Vérification du répertoire actif
if [ -d ${repMoisPreced} ] ; then
 
    echo "Attention, Le répertoire du mois precedent existe,"
    echo "on lance la procedure d'archivage"
    echo "dans ${repCible}..."
 
    tar cfz ${repMoisPreced}.tar.gz ${repMoisPreced}
    # mv ${repMoisPreced}.tar.gz ${repCible}
    rm -rf ${repMoisPreced}
 
fi
 
if [ ! -d ${repMoisEncours} ] ; then
 
    echo "Le répertoire ${repMoisEncours} n'existe pas"
    echo "Création du répertoire..."
    mkdir ${repMoisEncours}
 
fi
 
# S'il n'existe pas, on sauvegarde la base mysql dans un fichier dump
if [ ! -f ${repMoisEncours}/${FichierArchive} ] ; then
 
    # dump de la base mysql
    echo "Le fichier dump n'existe pas,"
    echo "création en cours..."
    /usr/bin/mysqldump -A -u root -pMotDePassMySQL > ${repMoisEncours}/${FichierArchive}
 
    # On remet les droits par défaut
    chown apache:apache -Rf ${repCible}../../
    chmod 775 -Rf ${repCible}../../
 
else
 
    echo Le fichier ${repMoisEncours}/$FichierArchive existe déjà !
    echo La sauvegarde a échouée.
 
fi