Sauvegarde de bases MySQL

Objectif : Sauver les bases de données MySQL vers un « partage windows » (ici un serveur Samba) depuis un serveur Ubuntu Linux.

On conservera une sauvegarde par jour avec trente jours d’historique.
C’est quelque chose de relativement simple mais que je garde sous la main ici au cas où je devrai le refaire… Voici le code d’un petit script bash script fait rapidement (pas optimal, je sais). Mais pour commencer, il faut :

# Créer un utilisateur de la base de données avec accès en lecture pour les sauvegardes
mysql -u root -p
mysql> GRANT SELECT,RELOAD,LOCK TABLES ON *.* TO ‘backup_user’@’localhost’;

# Ajouter root au groupe mysql (car cron lance les tâches en tant que root)
sudo usermod -a -G mysql root

# Autoriser l’accès en lecture aux fichiers de mysql pour les utilisateurs du groupe mysql
sudo find /var/lib/mysql -maxdepth 1 -type d -exec chmod g+r \{\} \;
# Lister les bases de données
mysql -u backup_user -B -e ‘show databases;’
# En sauvegarder une (pour tester)
mysqlhotcopy -u backup_user databaseName /TheBackupDir/
# Sauver toutes les bases -> Ca ne marche pas car certaines bases listées ne sont pas accessibles
for i in `mysql -u backup_user -B -e ‘show databases;’`; do echo $i; mysqlhotcopy -u backup_user « $i » /TheBackupDir/ ; done

# Sur le partage samba, créer un répertoire WebServerBackup et ajouter un fichier vide autoBackup pour que le script puisse détecter qu’il a accès au bon répertoire, et qu’il a été monté correctement avant de lancer la sauvegarde.

Le partage windows utilisé ici n’a pas besoin de login et de mot de passe, mais dans le cas contraire, il suffit d’ajouter user= »myuser »,password= »mypassword » à la liste des options de la commande « mount ».

Le répertoire /var/www dir sera sauvé (sans conserver d’anciennes versions) dans le même répertoire, et sera mis à jour avec rsync. Un log sera écrit dans /var/log/backup.log

Voici le script :

#!/bin/bash
echo >> /var/log/backup.log
echo >> /var/log/backup.log
day=$(date +%d-%m-%Y_%Hh%M)
# List of databases to backup. Unfortunately, 
#   mysql -u backup_user -B -e 'show databases;'
#   lists system databases that cannot be saved. Using manual list instead in the for loop
echo "-------------------------------------------------" >> /var/log/backup.log
echo "Beginning WebServer Backup -> Launching backupWebsite.sh" >> /var/log/backup.log
date -R >> /var/log/backup.log
mount -t cifs -o iocharset=utf8,file_mode=0777,dir_mode=0777 //MySambaServer/MySambaShare  /backupDisk
if [ -f "/backupDisk/WebServerBackup/autoBackup" ]
then
  rsync -rltp --del --stats  /var/www /backupDisk/WebServerBackup/www >> /var/log/backup.log # --del
  mkdir "/backupDisk/WebServerBackup/mysql_$day"
  # Backup all databases
  for i in 'mybase' 'wordpress' 'mysql'; 
    do 
      echo $i; mysqlhotcopy -u backup_user "$i" "/backupDisk/WebServerBackup/mysql_$day" >> /var/log/backup.log ;
    done
  # Remove the old database backups (more than 30 days)
  find /backupDisk/WebServerBackup -maxdepth 1 -type d -name "mysql_*" -mtime +30 -exec rm -rf \{\} \;
else
  echo "Echec du montage ! ***Pas de sauvegarde du serveur web !***" >> /var/log/backup.log
fi

umount /backupDisk

echo "WebServer BACKUP FINISHED (in //MySambaServer/MySambaShare/WebServerBackup )" >> /var/log/backup.log
date -R >> /var/log/backup.log
echo "**************************************************" >> /var/log/backup.log

Enfin, on met un lien vers ce script (rendu exécutable par un sudo chmod a+x /usr/bin/backupWebsite.sh) dans le dossier /etc/cron.daily/ pour qu’il se lance une fois par jour, mais sans l’extension .sh car certaines versions de cron ignorent les fichiers en .sh :

sudo ln -s /usr/bin/backupWebsite.sh /etc/cron.daily/backupWebsite

Ce contenu a été publié dans Notes Info. Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*