Sauvegarder et restaurer un cluster Mysql avec Xtrabackup

Voici une solution complète qui va vous permettre de sauvegarder et de restaurer un cluster de type Mysql. La solution ne permet pas de faire du PITR mais uniquement la restauration de la dernière sauvegarde.
Pour information, Percona XtraBackup est la combinaison du programme xtrabackup et du script Perl innobackupex. Xtrabackup copie et manipule les fichiers de données InnoDB et XtraDB, alors que le script Perl permet d’augmenter les fonctionnalités, comme l’interaction avec un serveur MySQL et la sauvegarde de tables MyISAM.
 

1. Télécharger Xtrabackup :

L’outil de sauvegarde est proposé gratuitement par percona software ici ; http://www.percona.com/downloads/XtraBackup/
Au moment ou j’écris ces lignes, l’outil se compose de deux modules :

1. Xtrabackup

2. Innobackupex-1.5.1
Il faut installer ces binaires sur le serveur qui va vous servir à exécuter la sauvegarde.

2. Sauvegarde du cluster de base de données

La sauvegarde est pilotée par le binaire innobackup qui va lancer au besoin l’outil xtrabackup pour sauvegarder les tables transactionnelles au format innodb. Les autres types de tables seront sauvegardés directement par innobackupex.

3. La sauvegarde

Création des répertoires de sauvegarde
Sur le noeud 1 en tant qu’utilisateur mysql il faut créer trois répertoires :
mkdir /backup/MYSQL/
mkdir /backup/MYSQL/logs
mkdir /var/lib/mysql/scripts

3.1. Copie du fichier de sauvegarde

Créér le fichier backup_mysql_hot_xtrabackup.sh dans le répertoire /var/lib/mysql/scripts
touch /var/lib/mysql/scripts/backup_mysql_hot_xtrabackup.sh

3.2. Ajout des droits d’exécution

chmod +x /var/lib/mysql/scripts/backup_mysql_hot_xtrabackup.sh

3.3. Modification du mot de passe

Modifier le mot de passe dans le fichier par le mot de passe de production
innobackupex-1.5.1 –defaults-file=/etc/my.cnf $DIRBACKUP/J –no-timestamp –user=root –password=ajoutdumotdepassedeproduction >> $LOGFILE 2>&1
innobackupex-1.5.1 –defaults-file=/etc/my.cnf –apply-log $DIRBACKUP/J –user=root –password= ajoutdumotdepassedeproduction >> $LOGFILE 2>&1

3.4. Programmation du script dans la crontab :

Ajout de ces deux lignes dans la crontab de l’utilisateur mysql :
#sauvegarde
30 02 * * * /var/lib/mysql/scripts/backup_mysql_hot_xtrabackup.sh
Voilà la sauvegarde va s’exécuter tous les jours à 02h30

3.5 Script de sauvegarde :

backup_mysql_hot_xtrabackup.sh
Ce script réalise la sauvegarde complète de la base de données.
#!/bin/sh
############################################################################
# #
# Backup a chaud MYSQL via Xtrabackup #
# #
# -parameter: none #
# -Return Code : 0 = OK 1 = Erreur #
# #
############################################################################
export DIRBACKUP=/backup/MYSQL
export LOGDIR=/backup/MYSQL/logs
export LOGFILE=$LOGDIR/mysql_xtrabackup_backup_`date +%d%m%y.%H%M%S`.log
printf « \n\n ############################Backup HOT MYSQL XTRABACKU############################ \n » >> $LOGFILE
### Cette partie permet de sauvegarder les sauvegardes sur une période de rotation de 4 jours.
printf « \n\n*******Archivage du precedent backup********\n » >> $LOGFILE
rm -rf ${DIRBACKUP}/J-4 >> $LOGFILE 2>&1
mv -f ${DIRBACKUP}/J-3 ${DIRBACKUP}/J-4 >> $LOGFILE 2>&1
mv -f ${DIRBACKUP}/J-2 ${DIRBACKUP}/J-3 >> $LOGFILE 2>&1
mv -f ${DIRBACKUP}/J-1 ${DIRBACKUP}/J-2 >> $LOGFILE 2>&1
mv -f ${DIRBACKUP}/J ${DIRBACKUP}/J-1 >> $LOGFILE 2>&1
printf « \n\n****************Backup Percona XtraBackup**************** \n » >> $LOGFILE
innobackupex-1.5.1 –defaults-file=/etc/my.cnf $DIRBACKUP/J –no-timestamp –user=root –password=XXXX >> $LOGFILE 2>&1
printf « \n\n****************Recover Backup Percona XtraBackup**************** \n » >> $LOGFILE
innobackupex-1.5.1 –defaults-file=/etc/my.cnf –apply-log $DIRBACKUP/J –user=root –password=XXXX >> $LOGFILE 2>&1
printf « \n\n**********Contenu backup *********** \n » >> $LOGFILE
ls -l $DIRBACKUP/J >> $LOGFILE 2>&1
printf « \n\n**********Status Backup*********** \n »
printf « \n\n**********Status Backup*********** \n » >> $LOGFILE 2>&1
export SUCCESS=`egrep  » completed OK » $LOGFILE | wc -l`
if [ « ${SUCCESS} » == « 2 » ]
then
echo « SUCCES : BACKUP OK »
echo « SUCCES : BACKUP OK » >> $LOGFILE
exit 0

4. La restauration de notre sauvegarde :

Les binaires de mysql et de xtrabackup sont installés :
Si vous avez un cluster de 3 noeuds il faut éteindre les 3 noeuds sur lesquels vous ne faites pas la restauration :

Il faut passer cette commande pour arrêter l’instance de base de données sur chaque nœud du cluster :
mysqladmin -u root -p shutdown –socket /var/lib/mysql/mysql.sock

Maintenant, il faut vérifier qu’il n’y a plus de processus et ensuite supprimer les fichiers de bases de données.
exemple : /!\ Attention ma base de données est dans  /app/mariadb/databases/* /!\

@1 en tant qu’utilisateur mysql
mysqladmin -u root -p shutdown –socket /var/lib/mysql/mysql.sock
ps –ef | grep my
rm –rf /app/mariadb/databases/*

@2 en tant qu’’utilisateur mysql
mysqladmin -u root -p shutdown –socket /var/lib/mysql/mysql.sock
ps –ef | grep my
rm –rf /app/mariadb/databases/*

@3 en tant qu’utilisateur mysql
mysqladmin -u root -p shutdown –socket /var/lib/mysql/mysql.sock
ps –ef | grep my
rm –rf /app/mariadb/databases/*

Exemple de restauration d’une sauvegarde :
Depuis le serveur 1, la dernière sauvegarde est stockée dans le répertoire /backup/MYSQL/J. Les sauvegardes des 4 jours précédents sont archivées dans les répertoires :
1. /backup/MYSQL/J-1
2. /backup/MYSQL/J-2
3. /backup/MYSQL/J-3
La commande qui va restaurer la sauvegarde depuis la dernière est celle-ci :
innobackupex –copy-back /backup/MYSQL/J/
il faut vérifier que la restauration se termine par un message indiquant que la restauration est valide :
innobackupex: completed OK!

5. Démarrage du cluster :

Puis il faut redémarrer chacun de nœuds du cluster, en commençant par le nœud où l’on a restauré les données (donc le nœud : 1).

5.1. @1

sudo service mysql start –wsrep-cluster-address= »gcomm:// »
Cette commande permet de dire au cluster que c’est ce nœud qui est le maître des données.

5.2. @2

sudo service mysql start
Lors du démarrage les données vont être répliquées sur ce nœud :
Starting MySQL………SST in progress, setting sleep highe[ OK ]

5.3. @3

sudo service mysql start
Starting MySQL………SST in progress, setting sleep highe[ OK ]
C’est une différence entre un cluster de base de données oracle et un cluster mysql, les données sont partagées par les instances Oracle, alors qu’en mysql, les données sont poussées vers répliquées sur chacun des nœuds.
Donc 3 nœuds = 3 fois la même volumétrie …
Et voilà votre base de données est restaurée et les nœuds synchronisés.

1 réflexion sur “Sauvegarder et restaurer un cluster Mysql avec Xtrabackup”

Les commentaires sont fermés.