« LINUX:RSYNC-jour/semaine/mois » : différence entre les versions

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
 
(3 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
__FORCETOC__
__FORCETOC__
----
''→ [[LINUX:RSYNC|retour à RSYNC]]''
----
=But=
=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.
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.
Ligne 6 : Ligne 9 :


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.
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.




Ligne 18 : Ligne 23 :
  #
  #
  # répertoire de la base des sauvegardes
  # répertoire de la base des sauvegardes
  set BASE=/produc/backup
  set BASE=/disk2/sauvegarde
  # répertoire des journaux
  # répertoire des journaux
  set DIRLOG=/produc/backup/log
  set DIRLOG=/disk2/sauvegarde/log
  #####################################################
  #####################################################
  # TEST: si la sauvegarde de centralisation est en cours, attendre 10 secondes
  # TEST: si la sauvegarde de centralisation est en cours, attendre 10 secondes
Ligne 39 : Ligne 44 :
  date
  date
  set NOW=`date +%u`
  set NOW=`date +%u`
# nom du répertoire du n° de jour de la semaine
  set REPERTOIREJ=j$NOW
  set REPERTOIREJ=j$NOW
  set NOM=`date +%m`
  set NOM=`date +%m`
  #set REPERTOIREM=m${NOM}
  # nom du répertoire mensuel
'''#'''set REPERTOIREM=m${NOM}
  set NOJ=`date +%d`
  set NOJ=`date +%d`
  # calcul du n° de semaine dans le mois (0 à 4)
  # calcul du n° de semaine dans le mois (0 à 4)
  # attention: la 5ème semaine (4) de fin de mois est courte (29 à 31)
  # attention: la 5ème semaine (4) de fin de mois est courte (29 à 31)
  set NOS=`expr ${NOJ} / 7`
  set NOS=`expr ${NOJ} / 7`
# nom du répertoire du n° d'ordre de la semaine dans le mois
  set REPERTOIRES=s${NOS}
  set REPERTOIRES=s${NOS}
  set NOA=`date +%y`
  set NOA=`date +%y`
  #set REPERTOIREA=a${NOA}
  # nom du répertoire annuel
'''#'''set REPERTOIREA=a${NOA}
  echo Jour de la semaine: $NOW
  echo Jour de la semaine: $NOW
  echo Jour du mois: $NOJ
  echo Jour du mois: $NOJ
Ligne 55 : Ligne 64 :
  echo Année: $NOA
  echo Année: $NOA
  # création des répertoires de sauvegarde si inexistants
  # création des répertoires de sauvegarde si inexistants
  if ( ! -d ${BASE}/${REPERTOIRES} ) then
  # jour de la semaine sauf le dimanche
  mkdir ${BASE}/${REPERTOIRES}
endif
  if ( ! -d ${BASE}/${REPERTOIREJ} ) then
  if ( ! -d ${BASE}/${REPERTOIREJ} ) then
   if ( $NOW != 7 ) then
   if ( $NOW != 7 ) then
Ligne 63 : Ligne 70 :
   endif
   endif
  endif
  endif
  #if ( ! -d ${BASE}/${REPERTOIREM} ) then
  # n° de semaine du mois
  # mkdir ${BASE}/${REPERTOIREM}
if ( ! -d ${BASE}/${REPERTOIRES} ) then
  #endif
  mkdir ${BASE}/${REPERTOIRES}
  #if ( ! -d ${BASE}/${REPERTOIREA} ) then
endif
  # mkdir ${BASE}/${REPERTOIREA}
# mois
  #endif
'''#'''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
  # 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 TEST1=`ps ax | grep "rsync -a --delete --stats " | grep -v grep`
Ligne 78 : Ligne 91 :
   date +%Y/%m/%d\ %H:%M:00 >> ${DIRLOG}/log.jsm.lis
   date +%Y/%m/%d\ %H:%M:00 >> ${DIRLOG}/log.jsm.lis
  # sauvegarde annuelle (actif les 4 premiers jours de janvier)
  # sauvegarde annuelle (actif les 4 premiers jours de janvier)
  #  if ( $NOM == "01" && $NOJ < "05") then
  '''#''' if ( $NOM == "01" && $NOJ < "05") then
  #  /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.annee.log ${BASE}/courant/ ${BASE}/${REPERTOIREA}
  '''#'''   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.annee.log ${BASE}/courant/ ${BASE}/${REPERTOIREA}
  #  /usr/bin/date > ${BASE}/${REPERTOIREA}/date.log
  '''#'''   /usr/bin/date > ${BASE}/${REPERTOIREA}/date.log
  #  endif
  '''#''' endif
  # sauvegarde mensuelle (actif les 4 premiers jours du mois)
  # sauvegarde mensuelle (actif les 4 premiers jours du mois)
  #  if ( $NOJ < "05") then
  '''#''' if ( $NOJ < "05") then
  #  /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.mois.log ${BASE}/courant/ ${BASE}/${REPERTOIREM}
  '''#'''   /usr/bin/rsync -a --delete --stats --log-file=${DIRLOG}/log.mois.log ${BASE}/courant/ ${BASE}/${REPERTOIREM}
  #  /usr/bin/date > ${BASE}/${REPERTOIREM}/date.log
  '''#'''   /usr/bin/date > ${BASE}/${REPERTOIREM}/date.log
  #  endif
  '''#''' endif
  # sauvegarde hebdomadaire, le dimanche, dernier jour de la semaine
  # sauvegarde hebdomadaire, le dimanche, dernier jour de la semaine
   if ( $NOW == 7 ) then
   if ( $NOW == 7 ) then
Ligne 106 : Ligne 119 :
----
----
En entête, trois variables sont à adapter selon vos besoins.
En entête, trois variables sont à adapter selon vos besoins.
Ces répertoires doivent exister ainsi que le répertoire "courant" se trouvant sous le répertoire repris à la variable "BASE".
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.  
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




Ligne 122 : Ligne 148 :
  30  23  *  *  *  root /manager/sauvegarde/rsync.jsm.bat  >  /manager/sauvegarde/rsync.jsm.log
  30  23  *  *  *  root /manager/sauvegarde/rsync.jsm.bat  >  /manager/sauvegarde/rsync.jsm.log
----
----
Dans ce exemple, il s'exécute tous les jours à 23h30 sous une cession de l'utilisateur "root".
Dans cet exemple, il s'exécute tous les jours à 23h30 sous une cession de l'utilisateur "root".
 




Ligne 131 : Ligne 156 :


----
----
''->[[LINUX:RSYNC|retour à RSYNC]]''
''&rarr; [[LINUX:RSYNC|retour à RSYNC]]''
----
__NOEDITSECTION__
__NOEDITSECTION__
[[Category:LINUX]]
[[Category:LINUX]]

Dernière version du 6 mars 2022 à 19:02


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