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