Sauvegarde Apache et MySQL

From Wikichris
Jump to: navigation, search

Portée de ce Backup

Quand ?

Ce script sauvegarde en roulement sur 7 jours, on peut donc remonter jusqu'à 7 jours en arrière.

Quoi ?

Il sauvegarde :

  • Toutes les bases de données utilisateurs et systèmes Mysql
  • le dossier /etc
  • le dossier /home/websites
  • la liste des packets APTITUDE installés


Il exclut :

  • /home/websites/upload

Dans un répertoire local

/home/backup/backup_per_day/1
/home/backup/backup_per_day/2
/home/backup/backup_per_day/3
/home/backup/backup_per_day/4
/home/backup/backup_per_day/5
/home/backup/backup_per_day/6
/home/backup/backup_per_day/7

Et dans un serveur FTP distant

backup_1.tgz
backup_2.tgz
backup_3.tgz
backup_4.tgz
backup_5.tgz
backup_6.tgz
backup_7.tgz

Le nombre correspond au jour de la semaine de la création du backup


Mise en place

les paquets suivants seront nécessaires

apt-get install rsync bzip2 ftp


Création du dossier /home/backup qui contiendra tout ce qui concerne la sauvegarde

mkdir /home/backup
chmod -R 700 /home/backup

Créer le script suivant en indiquant le login/passwd de votre serveur MySQL (source : Nicolas Lehuen )

/home/backup/mysql_backup.sh

#!/bin/bash

#
# CONNECTION PARAMETERS
#
HOST=localhost
PORT=3306
USER=root
PASSWORD=*********
#BACKUP_TO=/home/backup/mysql/DB
BACKUP_TO=$1

#
# LOCKING PARAMETERS
#

# For full InnoDB databases
LOCKING=--single-transaction

# For mixed or full MyISAM databases
#LOCKING=--lock-tables

#
# DO NOT CHANGE ANYTHING BELOW
#

# List databases
DATABASES=$(mysql -B -N --user=$USER --password=$PASSWORD -e "show databases;")

# Delete old backups, we don't use it here
#find $BACKUP_TO -type f -mtime +30 -delete

# Backup each database
for DATABASE in $DATABASES
do
echo Backing up $DATABASE

# Make the backup directory
mkdir -p $BACKUP_TO/$DATABASE

TODAY=$(date +%Y%m%d).$(date +%H%M%S)

# Dumps the database
mysqldump \
--host=$HOST \
--user=$USER \
--password=$PASSWORD \
$LOCKING \
--quick \
--extended-insert \
--add-locks \
--disable-keys \
--create-options \
--skip-comments \
--default-character-set=utf8 \
--routines \
--triggers \
$DATABASE \
> /tmp/$DATABASE.$TODAY.sql

# Compress and move the backup file in parallel, this helps with multiple CPUS
(
bzip2 -z9 /tmp/$DATABASE.$TODAY.sql \
&& mv /tmp/$DATABASE.$TODAY.sql.bz2 \
$BACKUP_TO/$DATABASE/$DATABASE.$TODAY.sql.bz2
) &
done

Création du dossier qui contiendra les sauvegardes

mkdir /home/backup/backup_per_day


création du script /home/backup/backup.sh

#!/bin/bash
#Executée par crontab d'utilisateur Root
#dossier 1: lundi, 2: mardi, etc
date=`date +%u`
rep_sauv=/home/backup/backup_per_day
ftp_server=dedibackup-bzn.online.net
ftp_login=sd-20854
ftp_pwd=********
prefix=srvTEST
exclude=--exclude\ origin/upload

#suppression de la sauvegarde d'il y a 1 semaine
rm -Rf ${rep_sauv}/$date

/home/backup/mysql_backup.sh ${rep_sauv}/${date}/mysql
/usr/bin/rsync -a -x -S --delete /etc ${rep_sauv}/$date
/usr/bin/rsync -a -x -S --delete ${exclude} /home/websites ${rep_sauv}/$date
cp /home/backup/*.sh ${rep_sauv}/$date
dpkg -l > ${rep_sauv}/$date/dpkg.list

# Then, backup the files via ftp
tar czf ${rep_sauv}/${prefix}_${date}.tgz ${rep_sauv}/$date

ftp -inv ${ftp_server} << END
user ${ftp_login} ${ftp_pwd}
passive
lcd ${rep_sauv}
put ${prefix}_${date}.tgz
close
bye
END

rm ${rep_sauv}/${prefix}_${date}.tgz

On réduit les droits d'accès à ces fichiers au seul utilisateur ROOT et on donne les droits en exécution

chmod -R 700 /home/backup

On programme l'exécution de ce backup à 2h tous les matin en créant le fichier suivant /etc/cron.d/backup

0 2 * * *       root    /home/backup/backup.sh

Reception d'un email quotidien

Root reçoit tous les jours l'état de la sauvegarde. Définissez un alias à root pour recevoir ses emails, ainsi vous avez un oeil sur vos backups tous les matins

Pour cela il faut modifier le fichier suivant

/etc/aliases

Pour y trouver cette ligne

root: votreemail@domaine.com

Puis mettre à jour les aliases

newaliases