leon47 Posté(e) le 26 mai 2008 Partager Posté(e) le 26 mai 2008 Bonjour les gens, Après quelques galères, je mets à dispo un (mon) script de sauvegarde de serveur, il sauve les fichiers de config des services sous Debian GNU/Linux. Je suis bien entendu ouvert à toutes améliorations, même plus que preneur. Le script sauvegarde les fichiers de config sur un ftp, dans le répertoire qu'on lui a donné. pour ajouter un service, il suffit de rajouter le nom du repertoire (dans le /etc ) dans la partie for DaPouet inet le script s'occupe du reste. #!/bin/sh # ce script va cloner l'installation de Debian ainsi que les fichiers de config # on lui passe en parametre le serveur destinataire de la sauvegarde # ainsi que le chemin du rep de sauvegarde # Historique # 1.0 - 25/12/2007 - Sauvegarde basique des fichiers de conf # 2.0 - 01/01/2008 - Sauvegarde egalement des BDD avec utilisation d'un fichier SQL # 3.0 - 03/01/2008 - Sauvegarde des BDD en incrémentale 1/Jour # 4.0 - 08/02/2008 - La restauration du serveur est dorénavent possible # 4.1 - 11/02/2008 - Ajout de MySQL dans la sauvegarde des fichiers de config # 4.2 - 14/02/2008 - Sauvegarde egalement du resolv.conf # 4.3 - 14/02/2008 - Sauvegarde du /etc/default # 4.4 - 01/04/2008 - Sauvegarde de pam.d # 4.5 - 04/04/2008 - Ajout de la suppression du rep backup avant la restauration # 4.6 - 15/04/2008 - Ajout de la sauvegarde de /var/www s'il existe # 4.7 - 27/04/2008 - Ajout de la sauvegarde de /home et de /root # if [ $# -eq 4 ] then # On fait une sauvegarde Ip=$1 User=$2 Password=$3 Path=$4 RepWork=/root/backup FileDpkg=$HOSTNAME.dpkg rm -r $RepWork mkdir -p $RepWork cd $RepWork # on sauvegarde les parametres IP cp /etc/network/interfaces ParamIp # on sauvegarde les parametres du resolv.conf cp /etc/resolv.conf ResolvConf # on sauvegarde le default tar czf Default.tgz /etc/default >/dev/null 2>&1 # on sauvegarde le pam.d tar czf Pam.tgz /etc/pam.d >/dev/null 2>&1 # on sauvegarde les crontab # celle de root crontab -l > CronTab 2>/dev/null # les autres tar czf $RepWork/cron.tgz /etc/cron.* > /dev/null 2>&1 # si le /root existe, on le sauve if [ -d /root ] then rsync -avb --delete --exclude=$RepWork /root /RootBak tar czf $RepWork/Root.tgz /RootBak > /dev/null 2>&1 fi # on sauvegarde les BDD avec mysqldump # on regarde si on trouve un fichier de parametre if [ -f ../SqlPassword ] then TotLigne=`cat ../SqlPassword | wc -l` # on initialise le pass sql PassWordSql="" if [ $TotLigne -eq 2 ] then PassWordSql=`tail -1 ../SqlPassword` fi IdSql=`head -1 ../SqlPassword` mysqldump $IdSql $PassWordSql --opt --flush-logs --master-data=2 --all-databases --delete-master-logs > $HOSTNAME.sql tar czf $HOSTNAME.sql.tgz $HOSTNAME.sql >/dev/null 2>&1 rm $HOSTNAME.sql # On sauvegarde le fichier de param des bases a sauver cp ../SqlPassword . # On telecharge l'applet de telechargement du script de sauvegarde incrementale des bases echo "CloneSql.sh $1 $2 $3 $4" >> /etc/cron.daily/savesql chmod +x /etc/cron.daily/savesql /etc/init.d/cron restart fi # on sauvegarde la liste des paquets dpkg --get-selections > $FileDpkg # on regarde la liste des paquets pour sauvegarder # les fichiers de conf qui font bien for DaPouet in apache2 bind postfix vsftpd courier amavis spamassassin freeradius nagios2 mysql openser do cat $FileDpkg | grep -v "-" | grep $DaPouet > /dev/null 2>&1 && i=1 || i=2 if [ $i -eq 1 ] then tar czf $RepWork/$DaPouet.tgz /etc/$DaPouet > /dev/null 2>&1 fi done # vu que asterisk est compile, on test le repertoire /etc/asterisk if [ -d /etc/asterisk ] then tar czf $RepWork/asterisk.tgz /etc/asterisk > /dev/null 2>&1 fi # on cree le script qui va copier ce petit monde sur le ftp echo "open $Ip" > scriptFTP.param echo "user $User $Password" >> scriptFTP.param echo "lcd $RepWork" >> scriptFTP.param echo "mdelete $Path$HOSTNAME/*" >> scriptFTP.param echo "rmdir $Path$HOSTNAME" >> scriptFTP.param echo "mkdir $Path$HOSTNAME" >> scriptFTP.param echo "cd $Path$HOSTNAME" >> scriptFTP.param for ListeSauv in `ls $RepWork | tr -s '\n ' ' '` do echo "put $ListeSauv" >> scriptFTP.param done echo "bye" >> scriptFTP.param # on fait la copie proprement dite ftp -inv <scriptFTP.param > /dev/null 2>&1 elif [ $# -eq 5 ] then # On restaure la sauvegarde Ip=$1 User=$2 Password=$3 Path=$4 RepWork=/root/backup FileDpkg=$HOSTNAME.dpkg rm -r $RepWork mkdir -p $RepWork cd $RepWork wget -nd -r ftp://$User:$Password@$Ip/$Path/$HOSTNAME rm scriptFTP.param # On restaure les parametres IP mv ParamIp /etc/network/interfaces # On restaure le resolvconf cp ResolvConf /etc/resolv.conf # On restaure le /etc/default cd / tar xzf $RepWork/Default.tgz cd $RepWork rm Default.tgz # On restaure le pam.d cd / tar xzf $RepWork/Pam.tgz cd $RepWork rm Pam.tgz # On restaure les crontab # Celle de l'user cat CronTab >>/var/spool/cron/crontabs/root rm CronTab # Les autres cd / tar xzf $RepWork/cron.tgz cd $RepWork rm cron.tgz # On restaure le /root cd / tar xzf $RepWork/Root.tgz cd $RepWork rm Root.tgz # On restaure le /home cd / tar xzf $RepWork/Home.tgz cd $RepWork rm Home.tgz # On rsetaure les sites web if [ -f $RepWork/varwww.tgz ] then cd / tar xzf $RepWork/varwww.tgz cd $RepWork rm varwww.tgz fi # On met a jour le systeme dpkg --set-selections < $FileDpkg dselect install rm $FileDpkg # on regarde si on trouve un fichier de parametre # la syntaxe est # -u NomUser # -pPassword if [ -f ../SqlPassword ] then PassWordSql=`cat ../SqlPassword | cut -d" " -f2` IdSql=`cat ../SqlPassword | cut -d" " -f1` # On restaure les bases de donnees /etc/init.d/mysql stop # On vire l'integralité des bdd rm -r /var/lib/mysql/* for ListeSql in $( ls *.sql.tgz ) do tar xzf $ListeSql # On restaure les bdd Bdd=`ls *.sql` mysql $IdSql $PassWordSql -h localhost -D $Bdd < $Bdd rm $ListeSql rm $Bdd done fi rm *.sql.tgz chown -R mysql:mysql /var/lib/mysql # On arrete les services a mettre a jour, on met a jour, et on redemarre le service for Listing in $( ls | cut -d"." -f1 ) do /etc/init.d/$Listing stop cd / tar xzf $RepWork/$Listing.tgz rm $RepWork/$Listing.tgz /etc/init.d/$Listing start done echo "Merci de redemarrer la machine" echo "une fois vos fichiers enregistres" elif [ $# -ne 4 ] then echo "merci de lancer le programme avec pour parametre :" echo "CloneDeb.sh IP_ftp User Password Path" echo "Pour une sauvegarde" echo "Et avec :" echo "CloneDeb.sh IP_ftp User Password Path restore" echo "Pour une restauration" exit 1 fi et le script pour l'incrémental de mysql #!/bin/sh # ce script va sauvegarder mysql de maniere incrementale # on sauve la difference depuis le dernier mysqldump # on lui passe en parametre le serveur destinataire de la sauvegarde # ainsi que le chemin du rep de sauvegarde # Historique # 1.0 - 25/12/2007 - Sauvegarde basique des fichiers /var/log/mysql/mysql-bin.* if [ $# -eq 4 ] then # On fait une sauvegarde Ip=$1 User=$2 Password=$3 Path=$4 RepWork=/root/backupsql rm -r $RepWork mkdir -p $RepWork # on sauvegarde les fichiers bin de mysql cd /var/log/mysql tar czf $RepWork/MysqlIncr.tgz ./ # on cree le script qui va copier ce petit monde sur le ftp echo "open $Ip" > scriptFTP.param echo "user $User $Password" >> scriptFTP.param echo "lcd $RepWork" >> scriptFTP.param echo "cd $Path$HOSTNAME" >> scriptFTP.param for ListeSauv in `ls $RepWork | tr -s '\n ' ' '` do echo "put $ListeSauv" >> scriptFTP.param done echo "bye" >> scriptFTP.param # on fait la copie proprement dite ftp -inv <scriptFTP.param > /dev/null 2>&1 elif [ $# -ne 4 ] then echo "merci de lancer le programme avec pour parametre :" echo "CloneSql.sh IP_ftp User Password Path" exit 1 fi Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 26 mai 2008 Partager Posté(e) le 26 mai 2008 Tu devrais modifier l'entête de description du deuxième script, pour souligner que c'est juste pour la base de données Par contre, ce n'est pas un peu brutal, de copier une database comme ça, en plein fonctionnement ? Qu'est-ce qui te dit que tu ne copies pas pendant une modification, et que ce que tu sauvegardes n'est pas une base corrompue, parce qu'il manque ou qu'il reste des trucs qui ne sont pas encore copiés ou effacés dans la base quand tu lances ton backup... ? Perso, quand je dois backuper du mysql, j'arrête le service associé (c'est chez moi, donc, je m'en fous : je maîtrise la disponibilité et la demande ), et je copie... doit y avoir mieux, mais ta solution me paraît être l'extrême inverse... Lien vers le commentaire Partager sur d’autres sites More sharing options...
leon47 Posté(e) le 26 mai 2008 Auteur Partager Posté(e) le 26 mai 2008 Tu devrais modifier l'entête de description du deuxième script, pour souligner que c'est juste pour la base de données exact, corrigé (copié/collé, un faux ami) Par contre, ce n'est pas un peu brutal, de copier une database comme ça, en plein fonctionnement ? Qu'est-ce qui te dit que tu ne copies pas pendant une modification, et que ce que tu sauvegardes n'est pas une base corrompue, parce qu'il manque ou qu'il reste des trucs qui ne sont pas encore copiés ou effacés dans la base quand tu lances ton backup... nononon, je ne suis pas un bourrin ^^ je ne copie pas la base, mais uniquement le diff. la base se trouve dans /var/lib/mysql, et ce que je sauve est /var/log/mysql qui contient uniquement le différentiel entre le mysqldump et le moment où l'on tape la commande. Pour avoir tenté des gros (très) select, insert et tout le tralala pendant une copie, je peux restaurer sans souci. Bien entendu je ne restaure que ce qui a eu le temps de se sauvegarder. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Compte_supprime_74291 Posté(e) le 26 mai 2008 Partager Posté(e) le 26 mai 2008 OK, j'avais lu trop vite ce que tu dumpais. Mea culpa . Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.