Accueil > SystĂšme, Tutoriel > Un petit script de sauvegarde en shell pour vos machines Linux

Un petit script de sauvegarde en shell pour vos machines Linux

On ne le rĂ©pĂ©tera jamais assez : faites des sauvegardes ! Et non, ça n’est pas compliquĂ©, oui il existe des dizaines et des dizaines de solutions possibles, donc vous n’avez pas d’excuse pour ne pas le faire.

disque-dur

Si vous utilisez WordPress, vous avez peut-ĂȘtre dĂ©jĂ  installĂ© l’extension BackWPUp qui fonctionne Ă  merveille. Si ça n’est pas le cas, ou si vous souhaitez sauvegarder d’autres projets en mĂȘme temps, je vous propose ce petit script de sauvegarde en shell (pour Ubuntu par exemple) qui vous permettra de :

  • sauvegarder tous les fichiers d’un rĂ©pertoire ;
  • mettre Ă  jour votre rĂ©pertoire Ă  partir d’un serveur distant ;
  • crĂ©er un dump de vos bases de donnĂ©es, une par une ;
  • mettre Ă  jour vos bases de de donnĂ©es Ă  partir d’un serveur distant ;
  • crĂ©er une archive gzippĂ©e de votre sauvegarde.

Et tout ça en moins de 50 lignes, commentaires compris.

Ainsi vous n’aurez qu’à planifier un lancement de ce script Ă  la frĂ©quence qui vous convient pour ne pas avoir Ă  vous soucier de vos backups.

Mon script de sauvegarde d’un serveur Linux

#!/bin/sh

# Parametrage des fichiers
BACKUP_DIRECTORY=/home/backups
TEMP_DIRECTORY=$BACKUP_DIRECTORY/$(date +%Y-%m-%d)
SQLDUMPS_DIRECTORY=$TEMP_DIRECTORY/__SQL_DUMPS__
LOG_FILE=$TEMP_DIRECTORY.log
LOCAL_DIRECTORY=/var/www
LOCAL_SQL_USER=username
LOCAL_SQL_PASSWORD=password

# Acces au serveur distant
REMOTE_IP=192.168.0.1
REMOTE_SSH_USER=username
REMOTE_SSH_PASSWORD=password
REMOTE_DIRECTORY=/var/www
REMOTE_SQL_USER=username
REMOTE_SQL_PASSWORD=password

# Copie des fichiers locaux
echo "[$(date +%d/%m/%Y-%H:%M)] Sauvegarde des fichiers locaux" >> $LOG_FILE
cp -R $LOCAL_DIRECTORY $TEMP_DIRECTORY >> $LOG_FILE

# Mise a jour des fichiers locaux
echo "[$(date +%d/%m/%Y-%H:%M)] Mise a jour des fichiers" >> $LOG_FILE
lftp sftp://$REMOTE_SSH_USER:$BPASSWORD@$REMOTE_IP -e "mirror -e  $REMOTE_DIRECTORY $LOCAL_DIRECTORY ; quit" >> $LOG_FILE

# Copie des bases de donnees locales et mise a jour
echo "[$(date +%d/%m/%Y-%H:%M)] Sauvegarde et mise a jour des bases de donnees locales" >> $LOG_FILE
mkdir $SQLDUMPS_DIRECTORY/
DBS="$(mysql --user=$LOCAL_SQL_USER --password=$LOCAL_SQL_PASSWORD -Bse 'show databases;')"
for DB in $DBS
do
	echo " -> "$DB >> $LOG_FILE
  	mysqldump --user=$LOCAL_SQL_USER --password=$LOCAL_SQL_PASSWORD $DB > $SQLDUMPS_DIRECTORY/$DB.sql  
	mysqldump -host=$REMOTE_IP --user=$REMOTE_SQL_USER --password=$REMOTE_SQL_PASSWORD --databases $DB | mysql --user=$LOCAL_SQL_USER --password=$LOCAL_SQL_PASSWORD
done

# Compression de la sauvegarde
echo "[$(date +%d/%m/%Y-%H:%M)] Compression de la sauvegarde" >> $LOG_FILE
tar -jcvf $TEMP_DIRECTORY.tar.bz2 $TEMP_DIRECTORY

# Suppression du repertoire de sauvegarde
echo "[$(date +%d/%m/%Y-%H:%M)] Suppression du repertoire de sauvegarde" >> $LOG_FILE
rm -rf $TEMP_DIRECTORY
Sauvegarde et mise Ă  jour d’un serveur de dĂ©veloppement

Que contient ce script ?

  • Avant tout une section de paramĂ©trage : vous dĂ©finissez les valeurs qui vous intĂ©ressent afin d’accĂ©der Ă  votre serveur distant et de choisir oĂč vont ĂȘtre sauvegardĂ©es vos donnĂ©es ;
  • Ensuite une copie bĂȘte et mĂ©chante d’un dossier, dans le cas qui m’intĂ©resse il s’agit du dossier contenant tous mes codes sources ;
  • AprĂšs la copie, le serveur local est mis Ă  jour pour avoir les mĂȘmes fichiers que le serveur distant : les nouveaux fichiers seront ajoutĂ©s, les mises Ă  jour prises en compte et les fichiers inexistants sur le serveur distant seront effacĂ©s du serveur local ;
  • Puis vient le tour du traitement des bases de donnĂ©es. Le script de sauvegarde commence par lister toutes les bases de donnĂ©es herbergĂ©es sur le serveur local puis :
    • crĂ©e une archive par base de donnĂ©es avec mysqldump. De cette façon il est plus simple de restaurer une base de donnĂ©es en particulier sans avoir Ă  la retrouver au milieu de toutes les autres si on avait crĂ©Ă© un gros dump contenant toutes les bases de donnĂ©es ;
    • met Ă  jour les bases de donnĂ©es locales en injectant directement le dump fait Ă  partir du serveur distant ;
  • Compresse tous les fichiers sauvegardĂ©s dans une belle archive .tar.gz
  • Efface le dossier temporaire contenant tous les fichiers sauvegardĂ©s pour ne conserver que l’archive .tar.gz et le journal des opĂ©rations .log

Un script de backup, mais pas que

Vous avez pu constater que le script s’occupe aussi de rapatrier des donnĂ©es d’un environnement vers un autre. En fait, si vous le lancez toutes les nuits il vous permettra d’avoir le matin une archive contenant l’état Ă  J-1 de votre serveur local et un serveur local contenant les mĂȘme informations (Ă  J0) que votre serveur distant.

Cela peut ĂȘtre pratique dans un grand nombre de cas : si vous souhaitez synchroniser plusieurs serveurs entre eux, pour mettre Ă  jours des serveurs secondaires selon les donnĂ©es d’un serveur primaire (si vous ne l’avez pas dĂ©jĂ  fait je vous invite Ă  lire mon billet sur la mise en place d’une architecture serveurs distribuĂ©e), pour avoir tous vos dossiers avec vous quand vous prenez votre ordinateur portable
 ou dans mon cas pour ĂȘtre sĂ»r que votre serveur de dĂ©veloppement travaille avec des donnĂ©es actuelles et pas du lorem ipsum crĂ©Ă© par un utilisateur « toto ».

Ensuite, chacun est libre d’adapter le script pour, par exemple ne pas sauvegarder ni mettre Ă  jour les bases de donnĂ©es de dĂ©veloppement, mais rapatrier simplement un dump des bases de donnĂ©es distantes, le code ressemblera alors Ă  ça :

mysqldump -host=$REMOTE_IP --user=$REMOTE_SQL_USER --password=$REMOTE_SQL_PASSWORD --databases  $DB > $SQLDUMPS_DIRECTORY/$DB.sql
Faire un dump d’une base de donnĂ©es distante

Par contre si vous souhaitez simplement faire une copie des fichiers, tous les jours ou toutes les semaines, je vous conseille de conserver quand mĂȘme le rĂ©pertoire local Ă  synchroniser plutĂŽt que de le crĂ©er et de l’effacer Ă  chaque fois : de cette façon seules les modifications seront transfĂ©rĂ©es et non l’intĂ©gralitĂ© des donnĂ©es. Si vous souhaitez faire un backup complet, en transfĂ©rant toutes les donnĂ©es et toutes les bases de donnĂ©es, rien de plus simple :

mkdir $TEMP_DIRECTORY
lftp sftp://$REMOTE_SSH_USER:$BPASSWORD@$REMOTE_IP -e "mirror -e  $REMOTE_DIRECTORY $TEMP_DIRECTORY ; quit"
mkdir $SQLDUMPS_DIRECTORY/
DBS="$(mysql --user=$LOCAL_SQL_USER --password=$LOCAL_SQL_PASSWORD -Bse 'show databases;')"
for DB in $DBS
do
	mysqldump -host=$REMOTE_IP --user=$REMOTE_SQL_USER --password=$REMOTE_SQL_PASSWORD --databases $DB > $SQLDUMPS_DIRECTORY/$DB.sql  
done
tar -jcvf $TEMP_DIRECTORY.tar.bz2 $TEMP_DIRECTORY
rm -rf $TEMP_DIRECTORY
Script de sauvegarde fichiers + bases de données

Source: ResponsiveMind

Print Friendly, PDF & Email

Related Post

Les commentaires sont fermés.