Pour assurer les sauvegardes des données de ce site, j'avais commencé à faire un script bash qui faisait un dump uniquement si des données avaient changées. Mais il était insuffisant, car chaque changement provoquait la sauvegarde de toute la base de données. Pas vraiment incrémentale la démarche.

JP m'a indiqué un article qui mentionnait l'utilisation de SVN pour des sauvegardes d'une base mysql. Mais bien sûr ! Un gestionnaire de version, c'est ce vers quoi le script allait m'acheminer pour :

  • ne garder que les deltas des changements
  • être capable de retrouver la dernière version du site en cas de crash serveur
  • pouvoir retrouver une version donnée du site dans le cas d'un problème de configuration par exemple
  • pouvoir dupliquer la sauvegarde à plusieurs endroits facilement avec l'historique

Autant réutiliser des outils éprouvés.

Pour pouvoir faire des sauvegardes incrémentales il faut que ce soit avec des lignes insert distinctes par enregistrement. Mysqldump permet les deux :

# mysqldump par défaut
insert into table values (a1, b1, c1),..., (an, bn, cn);
# ou avec les options
# --complete-insert=FALSE --extended-insert=FALSE
insert into table values ( a1, b1, c1);
# ...
insert into table values ( an, bn, cn);

Pour ne pas faire des sauvegardes tous les jours, mais uniquement lorsqu'il y a des contenus nouveaux ou modifiés, il faut supprimer les insert dans la table wp_stats qui est modifiée régulièrement, et supprimer la ligne de fin qui donne le timestamp du dump. J'ai aussi ajouté le thème que nous utilisons car nous le modifions et à chaque mise à jour de wordpress, il est écrasé par l'original (cf script backup_wordpress.sh à la fin).

En ce qui concerne la gestion de version, git est plus simple à mettre en place (pas de serveur de référentiel nécessaire), mon choix s'est porté vers ce dernier. L'installation sous débian/ubuntu et l'initialisation de la sauvegarde est très simple :

$ sudo apt-get install git-core
$ mkdir -p /dir/to/backup
$ cd /dir/to/backup
$ git init
$ # apres avoir créé le script ./backup_wordpress.sh
$ ./backup_wordpress.sh
$ git add backup_wordpress.sh backup.sql
$ git commit -am "init backup"

Il reste ensuite à appeler le script régulièrement par crontab (nous le faisons tous les jours).

Pour répliquer la sauvegarde ailleurs avec git et ssh nous pouvons faire sur une machine avec git :

$ git clone ssh://user@host:port/dir/to/backup

et lancer un "git pull" par crontab dans ce répertoire.

Et vous comment faites-vous pour vos sauvegardes de blogs ?

Un autre article qui utilise svn :
http://www.sylvaindeloux.com/geek/sauvegarder-des-bases-mysql-avec-svn


backup_wordpress.sh :