Dump automatique

De Wiki de Jordan LE NUFF
Sauter à la navigation Sauter à la recherche

Présentation

Cette page a pour objet de décrire comment mettre en place un dump automatique d'une base de données MySQL.

Script

Définir un dossier dans lequel sera stocké le script de dump (exemple : /data/scripts) et le sécuriser :

mkdir -p /data/scripts
chmod 700 /data/scripts

Y créer un fichier (exemple : dump_bdd.sh) et le sécuriser :

touch /data/scripts/dump_bdd.sh
chmod 700 /data/scripts/dump_bdd.sh

Y renseigner le contenu suivant :

#!/bin/bash

#set -x

# Initialisation variables
HOST=`echo $HOSTNAME|awk -F\. '{print $1}'`
BCK_DIR="/data/save/$HOST_BDD"   #Dossier de sauvegarde
LOG_DIR="/data/logs/$HOST_BDD"   #Dossier des logs
DDATE=`date +'%Y%m%d'`  #Date du jour
DCDATE=`date +'%Y%m%d %T'`  #Date complete du jour
BCK_RETENTION=10  #Durée de rétention des sauvegardes
LOG_RETENTION=10  #Durée de rétention des logs
MAIL_DESTINATION="mymail@mydomain.com"  #Adresse(s) mail destinatrice(s) du fichier dump

# Création des dossiers
mkdir -p $BCK_DIR
mkdir -p $LOG_DIR

# Lancement du traitement
echo $(date "+%F %T")" : Début Batch Sauvegarde des BDD MySQL du ${DCDATE} du serveur ${HOST}" > ${LOG_DIR}/BCK_MYSQL_${DDATE}.log | tee

echo $(date "+%F %T")" : Sauvegarde des BDD MySQL" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log | tee
mysqldump --defaults-extra-file=/root/.credentials/.mysqldump.cred --login-path=local --opt -A > ${BCK_DIR}/BCK_MYSQL_${DDATE}.dmp
echo $(date "+%F %T")" : Fin de la sauvegarde" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log

echo $(date "+%F %T")" : Compression de la sauvegarde" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log| tee
gzip -f ${BCK_DIR}/BCK_MYSQL_${DDATE}.dmp

echo $(date "+%F %T")" : Envoi de la sauvegarde sur la boite mail" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log| tee
echo "La sauvegarde MySQL du serveur ${HOST} se trouve en attachment de ce mail"|mail -a ${BCK_DIR}/BCK_MYSQL_${DDATE}.dmp.gz -s "Sauvegarde BDD ${HOST} du `date +'%d-%m-%Y'`" ${MAIL_DESTINATION}

echo $(date "+%F %T")" : Purge des anciennes sauvegardes et logs" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log| tee
find ${BCK_DIR} -name "BCK_MYSQL*.dmp.gz" -mtime +${BCK_RETENTION} -exec rm -rf {} \;
find ${LOG_DIR} -name "BCK_MYSQL*.log" -mtime +${LOG_RETENTION} -exec rm -rf {} \;

echo $(date "+%F %T")" : Fin Batch Sauvegarde des BDD MySQL du ${DCDATE}" >> ${LOG_DIR}/BCK_MYSQL_${DDATE}.log| tee
# Fin du traitement

MySQL

Utilisateur

Créer utilisateur MySQL dont le rôle sera uniquement de réaliser des dumps (par exemple : mysqldump_user) et lui attribuer les droits correspondants :

CREATE USER 'mysqldump_user'@'localhost' IDENTIFIED BY 'xxxxxxxxxxxxxxx';
GRANT USAGE, SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'mysqldump_user'@'localhost';
FLUSH PRIVILEGES;

Identifiants

Créer un dossier caché (par exemple /root/.credentials) et le sécuriser :

mkdir /root/.credentials
chmod 700 /root/.credentials

Créer un fichier caché (par exemple .mysqldump.cred) et le sécuriser :

touch /root/.credentials/.mysqldump.cred

Y ajouter le contenu suivant :

[mysqldump]
user=mysqldump_user
password=xxxxxxxxxxxxxx

Et le sécuriser en le mettant en lecture seule :

chmod 400 /root/.credentials/.mysqldump.cred

crontab

Editer la crontab et y ajouter les lignes suivantes :

## Sauvegarde intégrale de la base données tous les jours à 02h00 du matin
0 2 * * * /data/scripts/dump_bdd.sh