Sauvegardes, restaurations et transferts
Contents
1 Sauvegardes
1.1 mysqldump
Ceci est à mon sens LA meilleure méthode. Elle est fournit en standart et fonctionne très bien. Cependant attention aux grosses bases de données. Si vous avez de grosses bases, alors regardez du côté d'XtraBackup.
Son usage avec un shell est comme suit (pour des bases de petite taille) :
mysqldump -uUTILISATEUR -pMOTDEPASSE -e --single-transaction --opt BASEDEDONNEES > backup-`date +%y%m%d`.sql |
Pour sauvegarder toutes les bases d'un seul coup :
mysqldump -uUTILISATEUR -pMOTDEPASSE --all-databases > backup-`date +%y%m%d`.sql |
Il existe aussi d'autres options :
- --no-data : permet de générer un fichir qui contient toutes les instructions de création des tables de votre base (CREATE DATABASE, CREATE TABLE...), mais pas les données elles-mêmes.
- --no-createdb et --no-create-info permettent de commenter automatiquement les instructions de création de schéma. Donc d'insérer des données depuis une sauvegarde dans une base avec des tables existantes.
- --lock-tables : permet de poser un LOCK sur toute une base. On obtient alors une cohérence entre les tables, mais pas entre les bases.
- --lock-all-tables : permet de poser un LOCK sur toutes les tables. Soyez conscient des impacts d'un tel LOCK sur une grosse base de données non transactionnel comme MyISAM. La mise en attente de toutes les requêtes pendant la durée de la sauvegarde pourraient faire croire au visiteurs que le serveur du site a planté. A la fin du dump, toutes les requêtes en attente seront exécutées (pas de pertes, sauf si la longueur de la queue a été dépassée).
- -e : permet de cumuler les création d'éléments de même type (va donc plus vite à la réimportation
- --single-transaction : permet de lancer les sauvegardes dans une transaction. Elle garantit donc que les tables InnoDB (moteur transactionnel) seront dans un état cohérent entre elles. Les tables qui ne supportent pas les transactions seront également sauvegardées, mais la cohérence ne sera pas garantie (l'instruction BEGIN est simplement ignorée pour ces tables). L'avantage de cette option est la non utilisation d'un LOCK. En faite, elles seront lockées à l'intérieur de la transaction, sans empêcher les autres clients de faire des modifications de la base.
- --master-data : permet d'avoir les position du master pour la réplication directement dans le dump.
- --opt : ajoute les drop-tables si elles existent.
1.1.1 Sauvegarder rapidement chaque base de données
Pour sauvegarder simplement et rapidement chaque base de donnée, voici une solution :
for I in `echo "show databases;" | mysql -uroot -p | grep -v Database`; do mysqldump -uroot -p -e --single-transaction --opt $I > "$I.sql"; done |
A vous de mettre le mot de passe en dur (créez un user backup par exemple avec les droits de backup uniquement pour améliorer la sécu).
1.2 mysqlhotcopy
Cette commande est un script PERL livré avec MySQL qui effectue en gros une copie brut des fichiers. Cependant cette méthode est assez performante.
Cette commande permet de faire :
- cp : si c'est pour une sauvegarde en locale
- scp : si c'est pour du distant
Il pose lui même des fichiers de lock sur les tables à sauvegarder. Il existe aussi l'option --record_log_pos qui permet d'enregistrer dans une table la position dans les journaux binaires lorsque le serveur est en mode maitre ou esclave (pour permettre de créer rapidement un nouvel esclave). Quelques petits exemples pour une sauvegarde en local :
mysqlhotcopy |
mysqlhotcopy user password /var/lib/mysql/ma_base |
Et pour une sauvegarde distante :
mysqlhotcopy |
mysqlhotcopy --user=user --password=pass user user@host:/home/mon_backup |
Un petit inconvénient, mais qui a son importance : mysqlhostcopy ne fonctionne qu'avec MyISAM et ARCHIVE. Il existe un outil payant (HOT Backup) qui permet de faire la même chose mais avec InnoDB en plus.
1.3 Snapshot LVM
Je n'aborderais pas ici comment on utilise LVM, mais c'est la méthode à utiliser pour des grosses bases (16 Go par exemple).
Tout d'abord, il faut poser un lock (et oui, on est quand même obligé, mais cela ne dure que quelques centièmes de secondes) :
mysql |
flush tables with read lock; |
Ensuite on fait notre snapshot :
lvcreate |
lvcreate --snapshot -n snap -L 16G /dev/volumegroupe/snapshot_mysql |
L'opération étant instantanée, nous pouvons enlever le lock :
mysql |
mysql> unlock tables; |
2 Restaurations
La restauration se fait en utilisant directement le programme principal :
mysql -u<user> -p<password> <database_name> < backup-`date +%y%m%d`.sql |
Si vous souhaitez ne restaurer qu'une seule base depuis un dump ou il y a toutes les bases :
mysql -u<user> -p<password> --one-database <database_name> < backup-`date +%y%m%d`.sql |
3 Transferts
Enfin, si l'objectif est de transférer la base d'une machine à l'autre, on peut combiner les deux appels sur une seule ligne :
mysqldump -uUTILISATEUR -pMOTDEPASSE BASEDEDONNEES | ssh utilisateur:motdepasse@IP "cat > myfile.sql" |
4 Scripts
4.1 Backup par mail
Voici un petit script a adapter selon vos besoins :
4.2 Sauvegarde et compression de toutes les bases
Cette méthode plus fastidieuse à pour avantage la sauvegarde base par base qui permet de restaurer que la base qui vous intéresse en cas de problème.
De plus, elle comprends de la compression à la volée de votre base. Il faudra cependant installer 7zip au préalable (j'ai fais le choix de 7zip pour avoir une meilleure compression).
Nous allons créer un script que nous allons placer dans /etc/scripts par exemple :
Le problème ici est le mot de passe en clair. Vérifiez donc à bien restreindre à l'utilisateur qui va backuper :
chmod 700 /etc/scripts/backup_mysql_databases.sh |