Trek au Népal – around-annapurna.com

Backup externe de bases de données via CRON/ANACRON et FTP

Backup externe de bases de données via CRON/ANACRON et FTP coffre 450x299

Un backup efficace de vos bases de données ! Crédit photo : Brook Ward, Flickr (CC BY-NC-ND 2.0)

Exemple pratique : backup d'une instance Gandi Simple Hosting vers un serveur FTP d'un autre hébergeur

Possédant une instance Simple Hosting chez Gandi, je souhaitais assurer des sauvegardes régulières de la base de données de manière automatisée et fiable en cas de fausse manipulation ou de problème technique. La solution décrite ici est universelle et peut fonctionner avec n'importe quel autre hébergeur. Il suffit de posséder un compte FTP externe, soit chez un autre hébergeur soit sur un serveur différent du même hébergeur ... et vous pourrez dormir sur vos deux oreilles !

Gandi offre un système de sauvegardes locales instantanées appelées snapshots, mais ces snapshots résident sur le serveur lui-même, donc sont totalement inutiles en cas de gros crash. C'est pourquoi j'ai mis en place le système suivant :

  • Dump quotidien des bases de données via anacron (ou cron)
  • Envoi par FTP des dumps sur un serveur externe
  • Effacement des données après 7 jours sur le serveur externe pour ne pas le surcharger

Dump quotidien des bases de données via anacron (ou cron)

Gandi Simple Hosting fonctionnant avec anacron, il suffit d'ajouter cette ligne au fichier /etc/cron/anacrontab :

@daily 0 mysql_backup mkdir -p /srv/data/tmp/mysql_backup ; mysqldump -u USER -pPASSWORD NOM_BDD | /bin/gzip -9 > /srv/data/tmp/mysql_backup/`date '+%F'`.NOM_BDD.sql.gz ; rm -f /srv/data/tmp/mysql_backup/`date '+%F' --date '1 week ago'`.NOM_BDD.sql.gz

Évidemment, il faut remplacer :

  • USER par l'utilisateur de la base de données
  • PASSWORD par le mot de passe de USER (en conservant le -p initial)
  • NOM_BDD par le nom de votre BDD à sauvegarder - remplacer aux trois endroits

Dans le détail, cette ligne créé le répertoire mysql_backup, y dépose un dump compressé de la base NOM_BDD avec la date du jour, et efface les dumps vieux d'une semaine ou plus.

Remarque : si vous le pouvez, créez un utilisateur ayant uniquement des droits de lecture sur la base en question. Cela renforcera la sécurité et évitera les coups de stress en cas de fausse manip' !

La version cron sur un autre hébergeur pour la commande de dump serait du type (mais je ne sais pas comment insérer la date du jour) :

0 0 * * * mysqldump --opt -Q -u USER --password=PASSWORD NOM_BDD | gzip > /chemin/NOM_BDD.sql.gz

Envoi par FTP des dumps sur un serveur externe

Ici, il s'agit d'envoyer chaque jour la sauvegarde qui vient d'être créée vers un serveur externe. En principe, vous n'utiliserez jamais ces sauvegardes ... sauf le jour où votre site aura été détruit / hacké / effacé / etc ...

Dans le fichier anacrontab, ajoutez maintenant cette ligne après celle du dump des bases de données :

@daily 0 FTP_backup php -f /srv/data/web/vhosts/www.exemple.com/backup.php

Pas de grande magie ici : on appelle simplement le fichier backup.php qui se trouve n'importe où (adaptez le chemin en conséquence), mais de préférence dans un endroit inaccessible par le public ! Pour gandi simple hosting, les fichiers "publics" sont dans /vhosts/www.exemple.com/htdocs/ : ainsi, le fichier backup.php ne peut pas être accédé directement !

Créez ce fameux fichier backup.php, avec le contenu suivant :

 <?php  

  $use_gzip      = 'yes';        // Change to 'no' if you don't want files gzipped 
  $remove_file   = 'no';        // Change to 'yes' if you want to delete the backup file from your account after sending. Pick yes to save server space 

  $use_ftp       = 'yes'; // Change to 'yes' if you want the backup file uploaded to a remote FTP server? If you pick yes, you must fill out the next 4 lines
  $ftp_server    = 'ftp.EXEMPLE.COM';   // FTP address
  $ftp_user_name = 'FTP_USERNAME';   // FTP username
  $ftp_user_pass = 'FTP_PASSWORD';   // FTP password
  $ftp_path      = "/PATH";  // Path to upload on FTP server
  $mode = FTP_BINARY; 

$file_name = date("Y-m-d") . ".NOM_BDD.sql.gz";
$file_path = "/tmp/mysql_backup/" . $file_name;
$ftp_id       = ftp_connect($ftp_server); 
$login_result = ftp_login($ftp_id, $ftp_user_name, $ftp_user_pass); 
ftp_pasv($ftp_id, true);
$upload       = ftp_put($ftp_id, $file_name, $file_path, $mode); 
ftp_close($ftp_id); 

if ($remove_file == "yes") { 
unlink($file_name); 
}
print $file_name . " : backup done!";

  //You can send a email alert 
  mail('EMAIL@EMAIL.com', 'backup successful', 'OK, backup successful');

Ce script est largement inspiré d'un script beaucoup plus complet, qui fonctionne très bien mais qui est inadapté en cas de grosse base de données car il peut provoquer des erreurs de mémoire.

Ici aussi, adaptez en conséquence :

  • ftp.exemple.com : votre serveur FTP
  • FTP_USERNAME : utilisateur FTP
  • FTP_PASSWORD : mot de passe FTP
  • PATH : un répertoire qui contiendra vos sauvegardes sur le serveur distant, ou le chemin absolu vers ce répertoire
  • NOM_BDD : doit être identique à celui de la tâche anacron
  • EMAIL@EMAIL.com : si vous souhaitez recevoir un e-mail, entrez ici votre adresse et le contenu de l'email si vous voulez le personnaliser

Comme pour l'utilisateur de la base de données, créez si possible un utilisateur FTP avec des droits minimaux (accès uniquement au sous-répertoire PATH et non pas à la racine de votre compte FTP) !

Ici aussi, la version cron pour appeler le script serait un peu différente :

0     0     *     *     *     php -q /home/CPANELUSER/public_html/backup.php >/dev/null 2>&1

Effacement des données après 7 jours sur le serveur externe pour ne pas le surcharger

Dans mon cas, le serveur FTP tourne sous CPanel, et la syntaxe de la tâche CRON est pour le coup légèrement différente de celle définie avec anacron chez Gandi :

0     14     *     *     *     find /home/CPANELUSER/PATH -mtime +7 -exec rm {} \;

CPANELUSER est votre nom d'utilisateur chez l'hébergeur externe, et PATH est le répertoire des sauvegardes utilisé plus haut.

Voilà ! Vous disposez maintenant d'une solution fiable et vous pouvez dormir sur vos deux oreilles ! N'hésitez pas à me faire part de vos commentaires si vous rencontrez des soucis lors de l'implémentation de ces étapes !

0 0 votes
Évaluation de l'article
The following two tabs change content below.
Backup externe de bases de données via CRON/ANACRON et FTP
De retour de deux fantastiques voyages au Népal, j'ai décidé de partager les souvenirs de ces treks et d'essayer de vous donner envie de découvrir à votre tour les Annapurnas. Plus récemment, j'ai commencé à publier sur ce blog quelques astuces sur Wordpress ... affaire à suivre !

Partager la page...

Subscribe
Me notifier des
guest

2 Commentaires
plus anciens
plus récents
Inline Feedbacks
View all comments
Dan
Dan
3 années plus tôt

Merci pour ton article qui m’a beaucoup aidé 😉 Par contre je ne trouve pas comment zipper et récupérer les fichiers du dossier « snapshot » et l’envoyer par ftp … Tu peux m’aider ? merci

Last edited 3 années plus tôt by Dan
Cyril Castella
Cyril Castella
3 années plus tôt
Reply to  Dan

Salut Dan, Pour les dossiers, j’ai ajouté la ligne suivant dans le fichier anacron: @daily 0 Files_backup tar -zcf /srv/data/tmp/mysql_backup/MONSITE_FILES.tar.gz /srv/data/web/vhosts Ainsi, tout le contenu du dossier /vhosts est compressé au format tar.gz et placé dans le répertoire /tmp/mysql_backup, avec le nom MONSITE_FILES. Je créé en quelque sorte mon propre snapshot, mais avec un nom que je maîtrise… J’utilise ensuite le même script que pour les bases (en adaptant $file_name bien sûr) pour envoyer le tout par FTP 🙂 Dans ce script, tu peux bien sûr avoir $file_name1, file_name2 et plusieurs $upload pour envoyer séparément plusieurs fichiers compressés vers ta… Read more »