Sachez que dans le cas d'un hébergement mutualisé comme chez 1&1 (par exemple), un backup des serveurs entiers (vous et les autres clients) est réalisé quotidiennement pour palier à une défaillance ou un crash d'un disque dur. En aucun cas, ces sauvegardes pourront être utilisé lors d'un piratage de votre FTP ou d'un accident de votre part...
Pour éviter ce drame, il est donc important de réaliser ses propres sauvegardes de ses bases de données et de ses fichiers. Je vous propose, donc ma propre "solution" qui permettra de faire cela les doigs dans le nez.
Pourquoi automatiser ses sauvegardes ?
Réaliser ses sauvegardes à la main est vraiment long et fastidieux, ce qui peut causer des erreurs ! De plus, en fesant ses sauvegardes manuellement, on n'a tendance à n'être pas assez ponctuel et régulier.
Pour ces raisons, je vous recommande grandement la mise en place d'une solution totalement automatisée et programmée à des fréquences récurrentes. Il faut limiter les risques !
Mise en place du script...
Pré-requis :
Avant toute chose, il est important d'effectuer les points suivants :
- Se connecter en SSH sur votre espace personnel 1&1 (espace client pour les logs)
- Disposer d'un second serveur distant accessible via SSH pour exporter vos backups quotidiens. J'utilise le serveur de l'université pour le moment.
- Dans le serveur distant, créer le répertoire pour vos sauvegardes (par exemple : ~/backups)
- Autoriser la connexion SSH entre les deux serveurs sans demande de mot de passe grâce à la clé RSA publique (un petit tutos bien pratique)
Créer le script :
Le Shellscript que je vous ai concocté permet d'effectuer les actions suivantes :
- Export de plusieurs bases de données MySQL en fichier texte
- Archivage et compression d'une liste de répertoires et des fichiers SQL exportés à sauvegarder
- Transfert de l'archive au second serveur distant
- Notification par e-mail
- Nettoyage de l'espace de travail (les backup de plus de 10 jours d'anciennetés sont supprimés)
#!/bin/sh # Script par HAEHNEL Jonathan - le 12.08.2012 # Bases de données MySQL à sauvegarder (tableau) declare -a DB_NAME='([0]="db4xxxxxx8" [1]="db33xxxxxx0")' # Nom des bases de données declare -a DB_HOST='([0]="db4xxxxx.db.1and1.com" [1]="db2xxx.1and1.fr")' # Host des bases de données declare -a DB_USER='([0]="dbo4xxxxxx" [1]="dbo33xxxxxx")' # Utilisateurs declare -a DB_PASSWD='([0]="motdepass1" [1]="motdepass2")' # Mots de passe (en clair) # Répertoires à sauvegarder (tableau) declare -a DIRECTORY_TO_SAVE='([0]="./blog/asset/upload" [1]="./blog/asset/images/article" [2]="./blog/asset/rss")' # Autres informations TMP_DIRECTORY='./tmp' # Répertoire temporaire BACKUP_DIRECTORY='./backup' # Répertoire de backup YOUR_EMAIL='jonathanhaehnel[at]gmail.com' # Votre adresse email TEXT_NOTIFICATION=`echo "La sauvegarde de vos services a bien été effectué le" $(date +%Y-%m-%d\ à\ %Hh%M) "! (Message envoyé automatiquement - DO-NOT-REPLY)"` # Contenu de la notification SCP_INFOS='jhaehnel@turing.u-strasbg.fr:/users/x/jhaehnel/backup' # Serveur distant pour l'exportation de l'archive NOTIFY_MAIL=1 # 1= notifier par email ou 0= ne pas notifier ARCHIVE_NAME="backup_"$(date +%Y-%m-%d)".tar" # -------------------------------------------------------------------------------------------------- # Ne pas modifier ci dessous ! --------------------------------------------------------------------- echo "***** BACK-UP START *****" #Verification de l'existance des repertoires if ! [ -d $TMP_DIRECTORY ] then mkdir $TMP_DIRECTORY fi if ! [ -d $BACKUP_DIRECTORY ] then mkdir $BACKUP_DIRECTORY fi echo "> START of SQL dump" COUNTER=0 while [ $COUNTER -lt ${#DB_HOST[*]} ] # Parcours des différentes bases de données du tableau do echo ">> Dumping of" ${DB_NAME[$COUNTER]} "database ! [" `expr $COUNTER + 1` "of" ${#DB_HOST[*]} "]" mysqldump ${DB_NAME[$COUNTER]} -h${DB_HOST[$COUNTER]} -u${DB_USER[$COUNTER]} -p${DB_PASSWD[$COUNTER]} > $TMP_DIRECTORY"/"${DB_NAME[$COUNTER]}"_"$(date +%Y-%m-%d_%Hh%M).sql #Dumping de la base de données courante COUNTER=`expr $COUNTER + 1` done echo "> END of SQL dump" echo -e "\n> START Copying files to" $TMP_DIRECTORY COUNTER=0 while [ $COUNTER -lt ${#DIRECTORY_TO_SAVE[*]} ] # Parcours des différents répertoires du tableau do echo ">> Copy of" ${DIRECTORY_TO_SAVE[$COUNTER]} "directory ! [" `expr $COUNTER + 1` "of" ${#DIRECTORY_TO_SAVE[*]} "]" cp -R ${DIRECTORY_TO_SAVE[$COUNTER]} $TMP_DIRECTORY # Copie recursive des fichiers du dossier courant dans le dossier temporaire COUNTER=`expr $COUNTER + 1` done echo "> END Copying files to" $TMP_DIRECTORY echo -e "\n> START creating final archive" (cd $TMP_DIRECTORY; tar cf $ARCHIVE_NAME *; gzip -9 $ARCHIVE_NAME) # Archivage et compression mv $TMP_DIRECTORY"/"$ARCHIVE_NAME".gz" $BACKUP_DIRECTORY # On déplace l'archive dans le dossier des backups echo ">> TAR archive and GZIP compression complete !" echo "> END creating final archive" echo -e "\n> START sending the archive to " $SCP_INFOS scp $BACKUP_DIRECTORY"/"$ARCHIVE_NAME".gz" $SCP_INFOS #On envoye l'archive crée sur notre serveur distant echo "> END sending the archive" if [ $NOTIFY_MAIL -eq 1 ] then echo -e "\n> NOTIFY by email OK !" echo $TEXT_NOTIFICATION | mail -s "[BACK-UP] Confirmation" $YOUR_EMAIL #On envoye l'email de confirmation fi echo -e "\n> START Cleaning workspace" find $BACKUP_DIRECTORY -type f -ctime +10 -name 'back*' -exec rm -f {} \; #On supprime les backups de plus de 10 jours rm -R $TMP_DIRECTORY"/"* #On nettoye le repertoire temporaire echo "> END Cleaning workspace" echo "***** BACK-UP DONE *****"
Exemple d'exécution du script magique :
Après avoir rajouter le script dans votre espace personnel (htdocs), complètez-le avec vos propres paramètres et rendez-le executable avec la commande suivante : chmod 700 backup_script.sh
(uiserver):u59xxxxxxxx:~ > ./backup_script.sh ***** BACK-UP START ***** > START of SQL dump >> Dumping of db41xxxxxxx database ! [ 1 of 2 ] >> Dumping of db33xxxxxxx database ! [ 2 of 2 ] > END of SQL dump > START Copying files to ./tmp >> Copy of ./blog/asset/upload directory ! [ 1 of 3 ] >> Copy of ./blog/asset/images/article directory ! [ 2 of 3 ] >> Copy of ./blog/asset/rss directory ! [ 3 of 3 ] > END Copying files to ./tmp > START creating final archive >> TAR archive and GZIP compression complete ! > END creating final archive > START sending the archive to jhaehnel@turing.u-strasbg.fr:/users/x/jhaehnel/backups backup_2012-08-12.tar.gz 100% 25MB 2.8MB/s 00:09 > END sending the archive > NOTIFY by email OK ! > START Cleaning workspace > END Cleaning workspace ***** BACK-UP DONE *****
Automatiser l'execution avec l'outil "cron" :
Cron est un petit utilitaire qui permet d'effectuer automatique une liste de tâches récurrentes à des dates précises. Par chance, ce dernier est directement installé sur les serveurs mutualisés de 1&1 (sous linux).
Une tâche Cron possède obligatoirement six arguments pour définir son execution :
- Minute (0 à 59)
- Heure (0 à 23)
- Jour du mois (1 à 31)
- Mois (1 à 12)
- Jour de la semaine (0 à 7)
- Commande/script à executer
Par exemple, j'ai choisi d'executer mon script tous les jours à 18h, voici la rêgle :
crontab -e # Permet de définir une tâche (crontab -l pour vérifier) 0 18 * * * ./backup_script.sh
Mathieu a écrit : le 28/11/2014 à 12:01am
Merci beaucoup pour votre script qui vient de me faire gagner de nombreuses heures.
Par contre j'ai une question (de newbie):
Je souhaite sauvegarder/télécharger cette archive sur mon PC local sous Windows 7 64bits.
J'ai lu la notice de PSCP sans vraiment comprendre
http://marc.terrier.free.fr/docputty/Chapter5.html
Dois-je installer PSCP en plus de Putty ?
Pouvez-vous me donner un exemple concret ?
Merci par avance ;-)