Outils pour utilisateurs

Outils du site


scripting:backup

BASH : Sauvegarde complète et incrémentale

Script de backup


Ce script a été réalisé en vue de sauvegarder des datas de façon intelligente et ergonomique.

  • Il gère les sauvegardes complètes et incrémentales (3 incrémentales et 1 full par exemple)
  • Rotation des backups par rapport à la TTL définie en variable
  • Il gère les erreurs, les dépendances, les sources et destination de sauvegarde
  • Il vous enverra les logs par mail (poids/arborescence)







#!/bin/bash
# Script de sauvegarde (complète et incrémentale)
# Réalisé 23/10/11 par Mathieu ALEXANDRE
# Requiert les paquets 'tree' et 'mail'
# Réalise au moins une save complète avant les incrémentales
# Vérifie les dépendances et existences de modifications
# Notifie l'utilisateur sur l'état des backups
 
 
# Variables ajustables :
BACKUP_DIR=                                             # L'espace à sauvagarder
BACKUP_STOCK=                                           # Le stockage des backups
TTL=                                                    # Time to live d'un backup
TTR=                                                    # Time to rotate (full - $TTR - full)
DATE=`date '+%d-%m-%y_%HH%M'`                           # Date à insérer dans le nom
LOG_FILE=/tmp/backup_`date '+%d-%m-%y_%HH%M'`.log       # Le fichier de log
MAIL_FROM=                                              # Le mail envoyeur
NAME_FROM=backup                                        # Le nom de destinataire
MAIL_TO=                                                # Le mail du destinataire
 
# Fonction de backup complet
save_full ()
{
echo -e "\nSAUVEGARDE COMPLETE" >> $LOG_FILE
NBRE_FILES=`find $BACKUP_DIR -type f 2>/dev/null | wc -l`
if [[ $NBRE_FILES == 0 ]]
        then
        echo -e "\nIl n'y a aucun fichier dans $BACKUP_DIR, donc INUTILE DE SAUVEGARDER\n" >> $LOG_FILE
        RESULT=0
        notif
        exit 0
        else
        tar -czf $BACKUP_STOCK/SAVE_FULL_$DATE.tgz $BACKUP_DIR 2>/dev/null
        RESULT=$?
        sleep 3
        echo -e "\nArborescence de l'espace de backup\n" >> $LOG_FILE && tree -L 1 $BACKUP_STOCK >> $LOG_FILE
        echo -e "\nTaille de l'espace disque des backup\n" >> $LOG_FILE && du -hs $BACKUP_STOCK/* >> $LOG_FILE
        fi
}
 
# Fonction de backup incrémental
save_inc ()
{
echo -e "\nSAUVEGARDE INCREMENTALE" >> $LOG_FILE
NBRE_FILES=`find $BACKUP_DIR -type f -mtime -1 2>/dev/null | wc -l`
if [[ $NBRE_FILES == 0 ]]
        then
        echo -e "\nIl n'y a pas eut de modifications dans les dernières 24 heures, donc INUTILE DE SAUVEGARDER\n" >> $LOG_FILE
        RESULT=0
        notif
        exit 0
        else
        tar -czf $BACKUP_STOCK/SAVE_INC_$DATE.tgz `find $BACKUP_DIR -type f -mtime -1` 2>/dev/null
        sleep 3
        RESULT=$?
        echo -e "\nArborescence de l'espace de backup\n" >> $LOG_FILE && tree -L 1 $BACKUP_STOCK >> $LOG_FILE
        echo -e "\nTaille de l'espace disque des backup\n" >> $LOG_FILE && du -hs $BACKUP_STOCK/* >> $LOG_FILE
        fi
}
 
# Fonction de notification
notif ()
{
if [[ $RESULT == 0 ]];
        then
        cat $LOG_FILE | /usr/bin/mail $MAIL_TO -s "Backup de $BACKUP_DIR OK" -- -f $MAIL_FROM -F $NAME_FROM
        rm -f $LOG_FILE
        else
        echo -e "\nLa sauvegarde retourne un code erreur : $RESULT\n" && cat $LOG_FILE | /usr/bin/mail $MAIL_TO -s "Problème Backup de $BACKUP_DIR KO" -- -f $MAIL_FROM -F $NAME_FROM
        rm -f $LOG_FILE
        fi
}
 
# Fonction de check
check_dependance ()
{
# Est ce que TREE est installé
if [[ `/usr/bin/which tree | wc -l` == 0  ]];
        then
        RESULT=1
        echo -e "Le paquet TREE doit être installé !\nJE REFUSE DE CONTINUER DANS CES CONDITIONS" >> $LOG_FILE
        notif
        exit 1
        fi
# Est ce que MAIL est installé
if [[ `/usr/bin/which mail | wc -l`  == 0 ]];
        then
        RESULT=1
        echo -e "Le paquet MAIL doit être installé !\nJE REFUSE DE CONTINUER DANS CES CONDITIONS" >> $LOG_FILE
        notif
        exit 1
        fi
# Est ce que l'espace de stockage des backups existe
if [[ -d $BACKUP_STOCK ]];
        then
        echo OK > /dev/null
        else
        RESULT=1
        echo -e "Le répertoire de stockage ($BACKUP_STOCK) n'existe pas !\n JE REFUSE DE CONTINUER DANS CES CONDITIONS" >> $LOG_FILE
        notif
        exit 1
        fi
# Est ce que l'espace à backuper existe
if [[ -d $BACKUP_DIR ]];
        then
        echo OK > /dev/null
        else
        RESULT=1
        echo -e "Le répertoire à sauvegarder ($BACKUP_DIR) n'existe pas !\n JE REFUSE DE CONTINUER DANS CES CONDITIONS" >> $LOG_FILE
        notif
        exit 1
        fi
# Est ce que l'espace disque est inférieur à 95%
if [[ `df -h $BACKUP_STOCK | tail -1 | awk {'print $5'} | sed "s/.$//"` -ge 95 ]];
        then
        RESULT=1
        echo "L'espace disque de la partition contenant $BACKUP_STOCK est supérieur ou égal à 95% !\nJE REFUSE DE CONTINUER DANS CES CONDITIONS" >> $LOG_FILE
        notif
        exit 1
        fi
}
 
# Fonction de limite du nombre de backups
limit_backup ()
{
CALCUL_TTL=`expr $TTL - 1`
LISTE=`ls -t $BACKUP_STOCK | grep SAVE | sed -e "1,"$CALCUL_TTL"d"`
for x in $LISTE;
        do
        rm -f $BACKUP_STOCK/$x
        echo -e "\nSuppression de $x en fontion de votre limite de $TTL backups" >> $LOG_FILE
        done
}
 
# Script de backup
echo -e "> Backup du `date +%D` à `date +%H:%M:%S`\n" > $LOG_FILE
check_dependance
limit_backup
# Test au moins 1 complete avant le choix du type de sauvegarde
        NBRE_FULL=`ls $BACKUP_STOCK/SAVE_FULL_* 2>/dev/null | wc -l`
        if [[ $NBRE_FULL > 0 ]];
                then
                # Calcul la date de la derniere full et si <3 alors on sauvegarde en incrementale
                NBRE_INC=`ls -lt $BACKUP_STOCK | grep SAVE | head -$TTR | grep INC | wc -l`
                if [[ "$NBRE_INC" -lt "$TTR" ]];
                then
                save_inc
                notif
                else
                save_full
                notif
                fi
        else
        save_full
        notif
        fi
exit 0

scripting/backup.txt · Dernière modification: 15/04/2016 à 21:15 (modification externe)

Outils de la page