Quand on a des bases à sauvegarder on souhaite que leur disponibilité reste maximale.
Mais on souhaite aussi les sauvegarder, pour la même raison. Voici quelques notes sur le sujet.
1) Outils MySQL
a) MySQLdump
Fonctionnement : outil Mysql qui extraie le contenu des bases.
Exécution : mysqldump –opt –single-transaction –quick –routines -uroot -p mabase > /var/backups/mabase.sql
Restauration : mysql intranetse -uroot -p < /var/backups/mabase.sql
Temps de la sauvegarde : 3 minutes
Pré-requis : les tables doivent être en InnoDB pour utiliser l’argument « –single-transaction »
Avantages : connu, simple
Inconvénient : si on a une modification de tables (alter, drop, create, rename truncate) au moment ou on sauvegarde -> risque (faible) de perte de données
Conclusion : insuffisant
b) Mysqlhotcopy
Fonctionnement : script perl qui copie les fichiers en procédant à un lock des tables
Exécution : mysqlhotcopy -u=root intranetse -p=versatile /var/backups/mabase
Restauration : /etc/init.d/mysqld stop; cp -r /var/backups/mabase/* /var/lib/mysql/mabase/; chown -R mysql:mysql /var/lib/mysql/* ; /etc/init.d/mysqld start
Temps : quelques secondes
Pré-requis : Tables en MyISAM
Avantages : très rapide
Inconvénient : MyISAM seulement, « lock-tables » durant la sauvegarde, et stop du service SQL pour la restauration, fonctionne uniquement en local
Conclusion : on oublie
2) MySQL en cluster
Fonctionnement : arrêt de la réplication, dump, relance de la réplication, copie du dump vers le master.
Exécution : mysqladmin stop slave, mysqldump, mysqladmin start slave
Restauration : mysql mabase -uroot -p < /var/backups/mabase.sql
Temps : quelques minutes (1Go / mn pour le dump et 40 Mo/s pour la copie)
Dégradation du service : oui quelques minutes
Pré-requis : master / slave ou master / master avec service de VIP
Avantages : service absolument ininterrompu côté master
Inconvénient : identification du slave par script
Conclusion : adopté
3) LVM
Fonctionnement : snapshot d’un volume LVM, montage du volume, lancement d’un 2e mysql, dump
Exécution : paquet mylvmbackup à compiler, ou script ci-dessous
Restauration : mysql mabase -uroot -p < /var/backups/mabase.sql
Temps : sauvegarde : rapide pour LVM, quelques minutes pour le dump / restauration : quelques minutes
Dégradation du service : très réduit
Pré-requis : avoir LVM installé, configuré, et avec de l’espace disponible dans le VG comportant la partition « / » ou « /VAR »
Avantages : sauvegarde réutilisable pour d’autres applications, voir le système entier
Inconvénient : pré-requis, peu maîtrisé
Conclusion : Utilisable, mais trop contraignant au niveau des pré-requis
MYSQL cluster BACKUP
#!/bin/sh # definition de la date datum=`/bin/date +%Y-%m-%d` # definition du pass root rootpass="rootpass" # definition du repertoire de sauvegarde FILEDIR="/var/backups/mysql" # limite d'espace disk pour l'execution du script en pourcentage limit=85 # Verification de l'espace disk occupe par le repertoire FILEDIR for line in `df -aPh $FILEDIR | grep "^/" | grep \% | sort | awk '{print$6"-"$5"-"$4}'`; do percent=`echo "$line" | awk -F - '{print$2}' | cut -d % -f 1` done # stop le script si la limite est atteinte if [ $percent -ge $limit ]; then exit fi # Cluster : on verifie que l'on est sur le slave HOSTNAME=`cat /etc/hostname` OTHERNODE=` grep node /etc/ha.d/ha.cf | cut -d' ' -f2 | grep -v $HOSTNAME` IFCONFIG="/sbin/ifconfig" IFACE="eth0:0" ISIT=`$IFCONFIG | grep $IFACE | wc -l`; if test $ISIT = 0; then # On arrete le slave le temps de la sauvgearde mysqladmin -p$rootpass stop-slave; # Dump des bases et suppression de fichier plus vieux de 7 jours for i in `find /var/lib/mysql/* -type d`; do a=`echo $i | cut -d / -f 5` mysqldump -p$rootpass --opt $a | gzip > $FILEDIR/$a.${datum}.backup.gz scp $FILEDIR/$a.${datum}.backup.gz $OTHERNODE:$FILEDIR/ find $FILEDIR/ -type f -mtime +7 -exec rm -vf {} \; done # on relance le process de replication mysqladmin -p$rootpass start-slave; else exit fi
SCRIPT LVMBACKUP
#!/bin/bash # # Script de sauvegarde Mysql via LVM # v. 0.1 # Valeurs DBPASS="rootpass" # TODO : recuperer le LV contenant les datas SQL MONVG="/dev/ROOTVG/VAR" MYBKP=/mnt/backup MYINNODB="mysqladmin variables -uroot -p$DBPASS | grep innodb_log_file_size | cut -d'|' -f3 | cut -d' ' -f2" MYSQLSOCK2="/var/run/mysqld/mysql-snapshot.sock" FILEDIR="/var/backups/mysql" # Etape 1 : flush des tables mysql -e "FLUSH TABLES WITH READ LOCK;" -p$DBPASS # Creation du snapshot lvcreate -l100%FREE -s -n dbbackup $MONVG # Etape 3 : liberation des tables mysql -e "UNLOCK TABLES;" -p$DBPASS # Etape 4 : repertoire de montage mkdir -p $MYBKP # Etape 5 : On monte le snapshot mount /dev/ROOTVG/dbbackup $MYBKP # Etape 6 : On relance un nouveau SQL mysqld_safe --no-defaults --port=3307 --socket=$MYSQLSOCK2 --datadir=$MYBKP/lib/mysql --innodb-log-file-size=$MYINNODB & # Etape 7 : dump for i in `find $MYBKP/lib/mysql -type d`; do a=`echo $i | cut -d / -f 5` mysqldump -S $MYSQLSOCK2 -p$rootpass --opt $a | gzip > $FILEDIR/$a.${datum}.backup.gz find $FILEDIR/ -type f -mtime +7 -exec rm -vf {} \; done # Etape 8 : on arrete le SQL Secondaire mysqladmin -S $MYSQLSOCK2 shutdown kill -9 $(pgrep mysqld_safe) # Etape 9 : on demonte umount $MYBKP # Etape 10 : suppression du snapshot lvremove -f /dev/ROOTVG/dbbackup