LINUX:RSYNC-jour/semaine/mois

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour à RSYNC


But

Maintenant que tous les fichiers les plus récents sont rassemblés, il faut pouvoir remonter dans le temps car il est courant qu'on se rende compte un peu tard que l'on a modifié ou détruit un fichier important.

Il y a quelques années, on effectuait les sauvegardes sur bandes magnétiques. On réservait quatre bandes pour chaque jours de la semaine ouvrable et 4 bandes pour les différentes pour les différents vendredis du mois. On les utilisait en tournante. Par sécurité, ces bandes était soit remportées chez une personne de confiance soit mises dans un coffre à la banque.

Avec le temps, la masse de données à sauver devenant importante et de même le temps de sauvegarde, on se tourne vers des sauvegardes sur disques.

Ce script semble basic au regard des programmes existants mais il est simple; ses fichiers facilement accessibles. Dans certains cas, il est inutile de mettre en oeuvre des procédures complexes. Un exemple. Si vous êtres en présence d'un "dump" d'une base de données Oracle conséquente, chaque "dump" journalier est différent du précédent; une base de données active change tout le temps. Le système de sauvegarde par incrémentation n'a pas de sens et son extraction du système de sauvegarde est simple au regard de systèmes complexes. De plus, en cas de problème qui implique une récupération de la base de données, c'est la sauvegarde la plus récente et valide qui est utilisée; il faut une quantité de travail perdu minimale. D'un autre côté, plus les jours passent, moins la disponibilité journalière a d'importance; une analyse à posteriori n'a pas nécessairement besoin d'une date précise.


Script

Ce script a pour objectif de faire le même genre de travail. Il est basé aussi sur "rsync". "rsync" permet de synchroniser une source avec sa cible; il ne copie que ce qui a été modifié (répertoires, fichiers, privilèges, dates,...).

Voici le contenu du script que nous avons baptisé "rsync.jsm.bat":


#!/bin/csh
#####################################################
# variables à adapter
#
# répertoire de la base des sauvegardes
set BASE=/disk2/sauvegarde
# répertoire des journaux
set DIRLOG=/disk2/sauvegarde/log
#####################################################
# TEST: si la sauvegarde de centralisation est en cours, attendre 10 secondes
set TEST2=`/bin/cat ${DIRLOG}/rsync.courant.lock`
if ( "$TEST2" != "fin" ) then
 /bin/sleep 10s
endif
cd $BASE
# création des variables temporelles
# date format
#  %d jour du mois (2 digits)
#  %u jour de la semaine (1 à 7)
#  %w jour de la semaine (0 à 6) (0=dimanche)
#  %e jour du mois (espace en début à la place du 0)
#  %m mois (2 digits)
#  %y annee (2 digits)
#  %Y annee (4 digits)
date
set NOW=`date +%u`
# nom du répertoire du n° de jour de la semaine
set REPERTOIREJ=j$NOW
set NOM=`date +%m`
# nom du répertoire mensuel
#set REPERTOIREM=m${NOM}
set NOJ=`date +%d`
# calcul du n° de semaine dans le mois (0 à 4)
# attention: la 5ème semaine (4) de fin de mois est courte (29 à 31)
set NOS=`expr ${NOJ} / 7`
# nom du répertoire du n° d'ordre de la semaine dans le mois
set REPERTOIRES=s${NOS}
set NOA=`date +%y`
# nom du répertoire annuel
#set REPERTOIREA=a${NOA}
echo Jour de la semaine: $NOW
echo Jour du mois: $NOJ
echo Semaine du mois: $NOS
echo Mois: $NOM
echo Année: $NOA
# création des répertoires de sauvegarde si inexistants
# jour de la semaine sauf le dimanche
if ( ! -d ${BASE}/${REPERTOIREJ} ) then
 if ( $NOW != 7 ) then
  mkdir ${BASE}/${REPERTOIREJ}
 endif
endif
# n° de semaine du mois
if ( ! -d ${BASE}/${REPERTOIRES} ) then
 mkdir ${BASE}/${REPERTOIRES}
endif
# mois
#if ( ! -d ${BASE}/${REPERTOIREM} ) then
# mkdir ${BASE}/${REPERTOIREM}
#endif
# année
#if ( ! -d ${BASE}/${REPERTOIREA} ) then
# mkdir ${BASE}/${REPERTOIREA}
#endif
# TEST: si un autre processus rsync est encore en cours, ne pas démarrer celui-ci
set TEST1=`ps ax | grep "rsync -a --delete --stats " | grep -v grep`
set TEST2=`ps ax | grep "rsync --server " | grep -v grep`
set TEST3=`ps ax | grep "rsync " | grep -v grep`
if ( "$TEST3" == "" ) then
 if ( "$TEST1" == "" && "$TEST2" == "" ) then
  echo debut > ${DIRLOG}/rsync.jsm.lock
  date +%Y/%m/%d\ %H:%M:00 >> ${DIRLOG}/log.jsm.lis
# sauvegarde annuelle (actif les 4 premiers jours de janvier)
#  if ( $NOM == "01" && $NOJ < "05") then
#   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.annee.log ${BASE}/courant/ ${BASE}/${REPERTOIREA}
#   /usr/bin/date > ${BASE}/${REPERTOIREA}/date.log
#  endif
# sauvegarde mensuelle (actif les 4 premiers jours du mois)
#  if ( $NOJ < "05") then
#   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.mois.log ${BASE}/courant/ ${BASE}/${REPERTOIREM}
#   /usr/bin/date > ${BASE}/${REPERTOIREM}/date.log
#  endif
# sauvegarde hebdomadaire, le dimanche, dernier jour de la semaine
  if ( $NOW == 7 ) then
   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.semaine.log ${BASE}/courant/ ${BASE}/${REPERTOIRES}
   /usr/bin/date > ${BASE}/${REPERTOIRES}/date.log
# sauvegarde journalière sauf le dimanche qui est le jour de la sauvegarde hebdomadaire
  else
   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.jour.log ${BASE}/courant/ ${BASE}/${REPERTOIREJ}
   /usr/bin/date > ${BASE}/${REPERTOIREJ}/date.log
  endif
  echo fin > ${DIRLOG}/rsync.jsm.lock
 else
  echo "Occupé: sauvegarde encore en cours"
 endif
else
 echo "Occupé: autre process rsync en cours"
endif
date

En entête, trois variables sont à adapter selon vos besoins. Ces répertoires doivent exister.

Ensuite il teste le contenu d'un fichier et des processus afin de détecter si une autre tâche de synchronisation n'est pas encore en cours.

Les sauvegardes des jours de la semaine se font du lundi ai samedi et leurs répertoires se nomme "j1" à "j6".

Les sauvegardes des semaines du mois se font le dimanche et leurs répertoires se nomme "s0" à "s4".

Les sauvegardes mensuelles et annuelles sont possibles. Ces parties sont désactivées. Pour les réactiver, il suffit d'enlever la mise en commentaire (caractère "#").

Dans chacun de ces répertoire, vient se placer un fichier "date.log" contenant la date de sauvegarde. Ceci est utile pour s'y retrouver, spécialement pour le n° de la semaine.

On remarque que dans l'exemple, les sauvegardes se font sous le répertoire "/disk2", différent des endroits à sauver. Nous avons voulu par cette notation, insister qu'il s'agissait d'un second disque. Il est fortement recommandé de mettre les sauvegardes sur un autre disque physique que ceux où se trouvent les données à sauver. Si un disque tombe en panne, les données se trouvant sur un autre disque ne sont pas perdues. Je recommande de les répartir sur au moins deux disques par alternance. Pour y arriver les liens symboliques sont utiles. Par exemple, supposons que le répertoire du lundi est sur le disque 2 ("/disk2"). Ce répertoire se nomme "/disk2/sauvegarde/j1". Celui du mardi se retrouve sur le disque 3 ("/disk3") et se nomme "/disk3/sauvegarde/j2". On effectue un lien entre le disque 2 vers le disque 3:

ln -s /disk3/sauvegarde/j2 /disk2/sauvegarde/j2

On peut diminuer ce risque en utilisant une gestion de disques de type RAID (Raid1, Raid5,...).

N'oubliez pas de rendre exécutable ce script.

chmod 700 /manager/sauvegarde/rsync.jsm.bat


CRON

L'exécution de ce script peut s'automatiser via le service "cron".

On peut ajouter une ligne dans le fichier "/etc/crontab":


30   23   *   *   *  root /manager/sauvegarde/rsync.jsm.bat  >  /manager/sauvegarde/rsync.jsm.log

Dans cet exemple, il s'exécute tous les jours à 23h30 sous une cession de l'utilisateur "root".





retour à RSYNC