Script de sauvegarde des bases de données MySQL

Comme tous serveurs dédiés, il faut sauvegarder les bases de données. En effet, même si OVH fait des sauvegardes régulières, personne n’est à l’abri d’une erreur et dans un site dynamique, la base de donnée est primordiale.

Résumé du fonctionnement

Mon script récupère toutes les bases de données MySQL du serveur MySQL, puis compresse les données en « .tar.gz« . Une fois les données compressées, elles sont envoyées par mail sur un compte tel que Gmail. Il est tout à fait possible d’exporter les données sur un serveur FTP.

Client de messagerie

Mutt est un excellent client de messagerie en ligne de commande et gère parfaitement l’envoi de pièce jointe. Si vous n’avez pas installé de serveur de mails comme Postfix, n’oubliez pas d’exécuter un « apt-get install postfix » pour que votre serveur puisse envoyer des mails.

apt-get install mutt

Il faut écrire le corps du mail dans un fichier :

nano /root/message_mail.txt

Bonjour,
Ci-joint la sauvegarde MySQL.
@+
 Serveur RPS

Script de sauvegarde

Fonctionnement :

  •  toutes les bases de données hébergées sur le serveur seront sauvegardées dans « $HOME/backup/« 
  •  les logs du script pour vérifier qu’il s’exécute bien se trouve dans « $HOME/exploit/log/« 
  • puis compressées en « .tar.gz« 
  •  puis envoyées par mail

Commençons par créer le fichier qui va nous permettre de créer les logs et d’afficher le résultat des commandes avec des « Erreur », « Info », etc. Les fichiers de logs sont stockés dans « $HOME/exploit/log/ » :

nano $HOME/exploit/common/func.sh

#!/bin/bash
declare Log_File="$HOME/exploit/log/$(date "+%Y-%m-%d")_exploit.log"
function LOG_MSG_BEGIN
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |---    BEGIN   ---| $1" >> $Log_File
 }
function LOG_MSG_INFO
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |---    INFO    ---| $1" >> $Log_File
 }
function LOG_MSG_WARNING
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |***   WARNING  ***| $1" >> $Log_File
 }
function LOG_MSG_ERROR
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |***    ERROR   ***| $1" >> $Log_File
 }
function LOG_MSG_NORMALY_END
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |---    END     ---| $1" >> $Log_File
 }
function LOG_MSG_ABNORMALY_END
 {
 echo "| $(date "+%A %d %B %Y %H:%M:%S") |***ABNORMAL END***| $1" >> $Log_File
 }

Attaquons-nous maintenant au script qui va sauvegarder chaque base de données du serveur dans un fichier compressé séparé : pratique pour restaurer une base de données à la fois !

nano $HOME/exploit/scripts/save_mysql.sh

#!/bin/bash

declare Procedure="Save MySQL";
declare No_Error=0;

source $HOME/exploit/common/func.sh

LOG_MSG_BEGIN "$Procedure";

for db in $(mysql -u root -pMOT_DE_PASSE -e 'show databases' -s --skip-column-names)
do
mysqldump -u root -pMOT_DE_PASSE $db | gzip > "$HOME/backup/mysql_dump-$db-$(date +%Y-%m-%d-%Hh%M).gz";
Return_Code=$?;
if [[ $Return_Code -ne 0  ]]
then
LOG_MSG_ERROR "Erreur lors de la sauvegarde de ($db)";
No_Error=1;
else
LOG_MSG_INFO "Sauvegarde reussie pour ($db)";
fi
done

Envoi par MAIL

for mysqbackup_file in $( ls $HOME/backup/mysql_dump-*-$(date +%Y-%m-%d)*.gz )
do
/usr/bin/mutt -a "$mysqbackup_file" -s "Sauvegarde MySQL $(date +%Y-%m-%d)" -i /root/message_mail.txt votre_mail@domaine.com < /dev/null
done

if [[ $No_Error -eq 0  ]]
then
LOG_MSG_NORMALY_END "$Procedure";
exit 0;
else
LOG_MSG_ABNORMALY_END "$Procedure";
exit 2;
fi

Il faut rendre le script exécutable :

chmod +x $HOME/exploit/common/func.sh

chmod +x $HOME/exploit/scripts/save_mysql.sh

Le script sera lancé à 2h du matin, donc on retranche 1 journée dans la date qui s’affiche pour que la sauvegarde soit la date du jour.

Collez bien le mot de passe à l’argument « -p » pour la base de données c’est à dire, sans laisser d’espace.

Automatisation avec CRON

Le script script_save_mysql.sh sera exécuté toutes les nuits à 02h00.

crontab -e
00 02 * * * /root/script_save_mysql.sh > /dev/null
/etc/init.d/cron reload
Avec mots-clefs , , .Lien pour marque-pages : permalien.
Add Comment Register



Laisser un commentaire