Méthodes de backup gratuites pour mySQL

Lors de mon précédent article sur la sauvegarde des bases de données (je n’avais pas résisté au titre de provocateur de Mysqldump n’est pas un outil de backup), j’exposai les raisons pour lesquelles à mon sens mysqldump est un outil de sauvegarde insuffisant.

Après la destruction, voici le temps de la reconstruction et je me propose de vous exposer ici la solution que j’ai mis en place (et bien sur, je suis preneur de vos feedbacks !).

Petit rappel sur mon cahier des charges :

  1. Doit permettre de générer un fichier de sauvegarde en minimisant à tous prix l’impact sur les bases de données de production
  2. Doit utiliser un format de stockage compact qui permet de maintenir la sécurité des données
  3. Doit permettre une restauration rapide avec le minimum d’opérations

j’y ajoute que ce moteur de sauvegarde doit me permettre de traiter des tables InnoDB et myISAM puisque je n’arrive pas à choisir (non, quand on est expert, on dit qu’on prend le meilleur des deux en fonction des opérations prévue sur une table donnée 😉 ).

Copie de fichiers

La méthode de sauvegarde myIsam la meilleure est la copie simple de fichiers (!), et oui, ça surprend mais si vous voulez sauvegarder le plus rapidement possible votre base de données myIsam, effectuez les opération suivantes :

  • rsync du répertoire data de mySQL (on copie le plus gros des données, cela peut être long mais aucun impact sur les perfs de la DB)
  • FLUSH TABLES WITH READ LOCK (on place un lock n’autorisant que la lecture des données)
  • rsync du même répertoire (on ne reprend que les différences depuis le rsync 3 lignes plus haut, cela ne devait pas être trop long)
  • On enlève le lock

Je ne suis pas (du tout) un expert du rsync alors je ne vais pas vous mettre de ligne de commandes, d’autres le font très bien et GIYF…

Quelques problèmes avec cette méthode :

  • Impose un lock en écriture pendant quelques ms, s, min…
  • Ne fonctionne que sur myIsam, en effet, sur InnoDB, même des lectures peuvent engendrer l’écriture dans les fichiers data, cette méthode risque donc de corrompre la base de données cible. Si l’on veut appliquer ce principe sur InnoDB, il faut nécessaire arrêter complètement mySQL.

Snapshot au niveau disque

C’est probablement la solution la plus “industrielle”. Dans ce cas, on fait un snapshot de l’ensemble des disques du serveur, avec LVM par exemple, et on est en mesure de tout récupérer “en l’état” en redémarrant sur le snapshot. C’est une solution séduisante, surtout si on veut jouer avec une configuration compliquée.

Cependant, cette méthode me parait difficilement utilisable pour les bases de données “uniquement” : si on veut se servir d’un backup pour lancer un nouveau SLAVE ou pour migrer la version de mySQL…

XtraBackup

Percona XtraBackuphttp://www.percona.com/software/percona-xtrabackup/

Je n’ai pas trouvé d’autre script (gratuit) permettant de faire la même chose : sauvegarder le répertoire data de mySQL InnoDB et myIsam. En gros, après l’avoir fait tourner, on récupère un répertoire qui est la copie exacte et consistante du répertoire data de mySQL. Le transfert de ce répertoire vers un autre serveur suffit à avoir tout sauvegardé.

  • La sauvegarde se fait au niveau fichier, pas d’impact sur mySQL
  • Le format de stockage est le format natif du moteur choisi
  • La restauration se fait simplement en plaçant le contenu de la sauvegarde vers le répertoire data du nouveau serveur

Pour l’avoir expérimenté sur diverses configurations et mis en place en backup quotidien, je suis très heureux de ce script que pourtant j’avais eu un peu de mal à trouver…

A vos commentaires !

 

  • Anonymous

    Copie des fichiers : fonctionne uniquement pour une sauvegarde avec l'optique de restauration sur la même plateforme. Dans le cas où l'on serait amené à changer la plateforme (changement de la version de mysql lors d'une réinstallation), on peut oublier : le format des fichiers n'est pas identique d'une version à l'autre…