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); 
$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 !

A lire également ...

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 et Google Inbox notamment... affaire à suivre !

Poster un Commentaire

Soyez le premier à commenter !

Me notifier des
avatar
wpDiscuz