Forum Programmation.shell Script de sauvegarde totale/incrémentielle via tar

Posté par  .
Étiquettes : aucune
0
29
oct.
2007
Bonjour,

Je cherche à faire un script de sauvegarde qui gère l'incrémentiel. Mon script est pratiquement fait, me reste plus qu'un petit soucis, j'aimerrai pouvoir sauvegarder dans les incrémentielles seulement les fichiers qui ont changés depuis la dernière sauvegarde totale.

J'ai une fonctione qui détermine le dernier jour ouvré (qui fonctionne très bien). Et suivant ce jour ouvré, on détermine si il y a eu une sauvegarde, si il y en as pas, la sauvegarde du jour actuel sera totale, si il y en as une, la sauvegarde sera incrémentielle.

Pour celà, j'utilise la commande tar ainsi que quelques manipulation de dates.

Ce que je nomme synchro, c'est la réplication à l'identique des données d'une autre machine sur le réseau. Je fais cette synchro via rsync (avec tunneling smb par point de montage ... mais c'est un tout autre script qui fonctionne parfaitement). Dans le dossier des synchro, j'ai des sous dossiers correspondant aux machines, et dans ces sous dossiers, j'ai de nouveau des dossiers correspondants aux partages smb.

Voici mon code :


#!/bin/sh

date_current=`date "+%Y_%m_%d"`
dir_synchro='/home/synchro'
dir_backup='/home/backup'

iteration=1
while [ `date --date "$iteration days ago" "+%w"` -eq 0 ] || [ `date --date "$iteration days ago" "+%w"` -eq 6 ]
do
iteration=$[$iteration+1]
done
date_last_humanoid=`date --date "$iteration days ago" "+%Y/%m/%d"`
date_last=`date --date "$iteration days ago" "+%Y_%m_%d"`

for cat in `ls $dir_synchro | tr -s ' ' '!'`
do
cat=`echo $cat | tr -s '!' ' '`
for scat in `ls $dir_synchro/$cat | tr -s ' ' '!'`
do
scat=`echo $scat | tr -s '!' ' '`
mkdir $dir_backup/$cat/$scat -p
if [ ! -e $dir_backup/$cat/$scat/$date_last.tar.gz ]
then
echo "La sauvegarde précédente au $date_last n'existe pas ! La sauvegarde sera complète ..."
tar -c --atime-preserve -f "$dir_backup/$cat/$scat/$date_current.tar.gz" --gzip "$dir_synchro/$cat/$scat"
else
echo "La sauvegarde précédente au $date_last existe déjà ! La sauvegarde sera incrémentielle ..."
tar -c --atime-preserve -f "$dir_backup/$cat/$scat/$date_current.tar.gz" --gzip "$dir_synchro/$cat/$scat" --after-date $date_last_humanoid
fi
done
done


Ce qui ne fonctionne pas, c'est le " --after-date " car il se base sur la date de création du fichier et non pas de sa dernière sauvegarde ... j'ai la possibilité de modifier la date du fichier lors de la sauvegarde totale pour permettre la détection incrémentielles futurs ... mais ce n'est pas du tout jolis avec les synchro car la date est importante (surtout pour réduire la charge réseau).

Comment pourrai je faire pour tenir compte des modifications de fichiers depuis la dernière sauvegarde ?

Merci d'avance.
  • # tar -g

    Posté par  . Évalué à 2.

    Hello,

    tar -g permet de faire cela.
    Il faut faire un full avec tar -g fichier_index et ensuite, a chaque fois que tu fais ton tar -g fichier_index il te fera un fichier avec seulement le diff depuis le full.
    Quand tu veux refaire un full, tu écrases le fichier index.
    Voici un peit script de backup, il n'est pas parfait mais marche bien.

    #!/bin/bash

    host=ip_srv_backup
    user=user_remote
    bckrepo=/root/backup
    volumes=$bckrepo/volumes
    destdir=backup


    bckdate=$(date +%Y%m%d)
    repincr=$(date +%w_%a)

    bckday=0

    for b in `cat $volumes`
    do
    filename=${b##*/}
    if [ $bckday -ne "0" ]; then
    dirbackup=$destdir/$repincr
    tar zlc $b -g $bckrepo/bckidx-$filename | ssh $user@$host "cat > $dirbackup/$filename.tgz"
    else
    rm $bckrepo/bckidx-$filename
    dirbackup=$destdir/full
    tar zlc $b -g $bckrepo/bckidx-$filename | ssh $user@$host "cat > $dirbackup/$bckdate-$filename.tgz"

    fi

    done
    • [^] # Re: tar -g

      Posté par  . Évalué à 1.

      Merci beaucoup.

      Je pense comprendre, je vais adapter mon script via l'utilisation d'un fichier index.

      Merci pour tout, je test ça de suite.
  • # Backup-manager

    Posté par  . Évalué à 3.

    Sinon, ya backup-manager, un petit soft très rapide à coufigurer et qui gère la sauvegarde incrémentale:
    http://www.backup-manager.org/documentation/user-guide-stabl(...)
    • [^] # Re: Backup-manager

      Posté par  . Évalué à 2.

      Je viens de finir mon script (manque juste le nettoyage des trop anciennes sauvegardes). Voici mon code (pour qui ca interesse) :


      #!/bin/sh

      date_current=`date "+%Y_%m_%d"`
      dir_synchro='/home/synchro'
      dir_backup='/home/backup'

      function _full(){
      tar -c --atime-preserve -f "$dir_backup/$cat/$scat/$date_current-full.tar.gz" --gzip "$dir_synchro/$cat/$scat" -g "$dir_backup/$cat/$scat/index"
      }
      function _incremental(){
      tar -c --atime-preserve -f "$dir_backup/$cat/$scat/$date_current-incremental.tar.gz" --gzip "$dir_synchro/$cat/$scat" -g "$dir_backup/$cat/$scat/index"
      }
      function _added(){
      tar -c --atime-preserve -f "$dir_backup/$cat/$scat/$date_current-full-added.tar.gz" --gzip "$dir_synchro/$cat/$scat"
      }

      for cat in `ls "$dir_synchro" | tr -s ' ' '!'`
      do
      cat=`echo "$cat" | tr -s '!' ' '`
      for scat in `ls "$dir_synchro/$cat" | tr -s ' ' '!'`
      do
      scat=`echo "$scat" | tr -s '!' ' '`
      mkdir "$dir_backup/$cat/$scat" -p
      if [ `ls "$dir_backup/$cat/$scat/" | grep '.tar.gz' | grep -v 'added' | grep "full\|incremental" | wc -l` -eq 0 ]
      then
      _full
      else
      if [ ! -e "$dir_backup/$cat/$scat/$date_current-full.tar.gz" ] && [ ! -e "$dir_backup/$cat/$scat/$date_current-incremental.tar.gz" ]
      then
      if [ `date "+%w"` -eq 1 ]
      then
      _full
      else
      _incremental
      fi
      else
      if [ -e "$dir_backup/$cat/$scat/$date_current-full.tar.gz" ] && [ ! -e "$dir_backup/$cat/$scat/$date_current-incremental.tar.gz" ]
      then
      _incremental
      else
      _added
      fi
      fi
      fi
      done
      done
      • [^] # Re: Backup-manager

        Posté par  . Évalué à 2.

        Voici ma fonction de nettoyage :


        function _purge(){
        for date_archive in `ls "$dir_backup/$cat/$scat/" | grep "full\|incremental" | grep '.tar.gz' | cut -d'-' -f1`
        do
        date_archive_humanoid=$date_archive
        date_archive=`echo $date_archive | tr -d '_'`
        if [ $date_archive -lt `date --date "$day_retention days ago" "+%Y%m%d"` ]
        then
        echo "Suppression des anciennes archives du $date_archive_humanoid ..."
        rm "$dir_backup/$cat/$scat/$date_archive_humanoid-"*
        fi
        done
        }
  • # utiliser --newer-mtime

    Posté par  . Évalué à 2.

    J'ai eu le même problème que toi. C'est complètement nul que l'option "-after-date" (synonyme de "--newer") ne prenne pas la date de modification !

    Je ne sais plus comment j'ai trouvé (mon man ne le mentionne pas), il faut utiliser l'option --newer-mtime.

    Je fais comme ça pour gérér des sauvegardes différentielles (tu parles d'incrémentales mais tu te trompes je pense, en tous cas si on en croit Wikipedia http://fr.wikipedia.org/wiki/Sauvegarde#Sauvegarde_diff.C3.A(...) ) :

    La sauvegarde totale :
    LC_ALL=C date -R >perso/.lastbackup.date
    tar cfj $MYBACKUP perso


    La sauvegarde différentielle :
    LC_ALL=C tar --newer-mtime "`cat perso/.lastbackup.date`" -cjf $MYBACKUP perso

    Noter l'utilisation de LC_ALL=C pour gérer les dates sans ambiguïté (on peut aussi choisir de mettre la date au format ISO, je pense, à la place).
    • [^] # Re: utiliser --newer-mtime

      Posté par  . Évalué à 1.

      Je pense bien faire une sauvegarde incrémentielle ...

      Le man de la commande tar parle de "-G, --incremental " et l'explication de Wikipedia explique bien la méthode utilisée par l'index de tar comme étant une sauvegarde incrémentielle.

      Ta méthode n'utilise pas de fichier index, je pense alors que ta méthode peut être différentielle.
  • # dar

    Posté par  (site web personnel) . Évalué à 1.

    un outil vraiment complet pour faire des backups incrémentaux:

    http://dar.linux.free.fr/

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.