Sauvegardes - MySQL
Il existe plusieurs méthodes pour sauvegarder des bases mysql. En voici quelques unes.
mysqldump
Mysqldump est une méthode très simple à mettre en place. Cette fonction créé un fichier texte SQL qui permet de recréer la base. En réalité, mysqldump écrit sur la sortie standard, et on va la rediriger dans un fichier. Mysqldump possède de nombreuses options qui permettent, par exemple, de ne sauvegarder que certaines bases.
Avantages : méthode facile à mettre en place ; possibilité de modifier le fichier texte avant de réinjecter les données dans la base ; permet de réinjecter les données dans une autre version de mysql ou un autre SGDB, si les fonctions utilisées sont compatibles.
Inconvénients : pour une base très grosse (plusieurs Go), cette méthode peut être longue. D'autant que pour garantir la cohérence des données, il est nécessaire de poser un lock sur la base (les requêtes qui ont été envoyées pendant la sauvegarde ont été mises en attente, elles ne sont pas perdues).
Sauvegarde :
Syntaxe :
mysqldump -options > dump_mysql.txt mysqldump -options | gzip > dump_mysql.txt.gz # idem, en compressant (fortement conseillé pour de grosses bases)
Les principales options sont :
--all-databases | sauvegarde toutes les bases |
--databases base1 base2 | on précise les bases à sauvegarder |
--lock-all-tables | on ajoute un lock sur toutes les bases, pour garantir la cohérence des tables. Fortement conseillé, mais empêche toute transaction tant que ça n'est pas fini. |
-uroot -p (ou -uroot -ppassword) | on colle le nom de l'utilisateur derrière l'option -u. L'option -p va demander le mot de passe, ce qui empêche toute procédure automatique. On peut également coller le mot de passe en clair derrière l'option -p (ex: -ppassword) pour ne pas avoir besoin de le saisir (ce qui permet les sauvegardes automatiques). |
-h192.168.0.9 | on spécifie l'adresse ip (ou le nom) du serveur mysql |
--no-data | on ne sauvegarde que la structure des bases, pas les données |
Restauration :
mysql --all-databases < dump_mysql.txt | restaure la sauvegarde |
mysql -uroot -ppassword < dump_mysql.txt | idem avec le compte et le mot de passe |
tar
Avec tar, on va directement copier tous les fichiers utilisés par mysql. La méthode est simple, mais il faut faire attention à deux points :
- les fichiers à sauvegarder diffèrent suivant que le moteur est MyISAM ou InnoDB, sachant qu'on peut avoir un mix des deux. Mais dans les deux cas, si on veut tout sauvegarder, il suffit de faire un tar de tout le répertoire /var/lib/mysql/. C'est ce qu'on va faire ici.
- pour que les sauvegardes soient cohérentes et réutilisables, il faut stopper toute activité des bases. Pour cela, il faut se mettre dans un prompt mysql et taper :
mysql> FLUSH TABLES WITH READ LOCK;
Ensuite on passe à la sauvegarde proprement dite :
tar czvf dump_mysql.tar.gz /var/lib/mysql/*
Puis on délocke les bases pour qu'elles puissent reprendre leur activité :
mysql> UNLOCK TABLES;
Remarque : les requêtes qui ont été envoyées pendant la sauvegarde ont été mises en attente. Elles ne sont pas perdues.
Pour la restauration, il suffit de "détarer" dans /var/lib/mysql/ :
tar xzvf dump_mysql.tar.gz /var/lib/mysql/
snapshot lvm
La méthode du snapshot LVM nécessite de déjà connaitre le fonctionnement de LVM.
Le principe est le suivant : on créé un volume logique LVM qui va contenir /var/lib/mysql (par exemple /dev/vg/mysql). Ensuite, au moment où on désire faire la sauvegarde, on va locker les bases pour être sûrs d'avoir une sauvegarde cohérente, avec la commande suivante (dans un prompt mysql) :
mysql> FLUSH TABLES WITH READ LOCK;
Puis on créé le snapshot LVM (ça ne dure que quelques secondes) :
lvcreate --snapshot -n snapmysql -L 5G /dev/vg/mysql
Ensuite, on délocke les bases :
mysql> UNLOCK TABLES;
L'interruption de service n'a duré que quelques secondes. Maintenant, on peut tranquillement faire notre sauvegarde avec tar, en travaillant sur le snapshot. Attention quand même à ne pas laisser le snapshot actif trop longtemps (car ça peu ralentir le système s'il y a beaucoup d'opérations d'écriture sur la base) et à ne pas le faire trop petit pour ne pas qu'il sature, sinon les données seront inutilisables. Sauvegardons donc nos données :
mount /dev/vg/snapmysql /mnt/backup_mysql cd /mnt/backup_mysql tar czvf /tmp/dump_mysql.tar.gz * umount /mnt/backup_mysql
Il ne reste plus qu'à désactiver et supprimer le snapshot :
lvchange -a n /dev/vg/snapmysql lvremove /dev/vg/snapmysql
Cette méthode a l'avantage d'avoir une interruption de service très courte, mais elle nécessite d'avoir installé mysql dès le début sur un volume LVM, ou de l'avoir migré dessus par la suite.
autres méthodes
Il existe d'autres méthodes pour sauvegarder une base mysql, comme mysqlhotcopy ou la réplication des données. Mais cette dernière est trop complexe à mettre en place pour être abordée ici.