Configuration des sauvegardes incrémentielles MySQL avec Percona XtraBackup
Percona XtraBackup (PXB) est la norme industrielle pour effectuer des sauvegardes à chaud et non bloquantes des instances MySQL, MariaDB et Percona Server. Bien que les sauvegardes complètes soient essentielles, les bases de données volumineuses nécessitent une stratégie efficace pour minimiser les temps d'arrêt et l'utilisation du stockage. Les sauvegardes incrémentielles offrent cette efficacité en capturant uniquement les modifications de données qui se sont produites depuis la dernière sauvegarde réussie.
Ce guide explore comment exploiter PXB pour mettre en œuvre une stratégie robuste de sauvegarde incrémentielle. Nous aborderons les concepts fondamentaux, les commandes nécessaires pour effectuer des instantanés incrémentiels séquentiels et le processus en plusieurs étapes requis pour une restauration réussie.
Comprendre le mécanisme incrémentiel de Percona XtraBackup
PXB s'appuie sur le fonctionnement interne du moteur de stockage InnoDB, en particulier le suivi des modifications à l'aide du Log Sequence Number (LSN). Chaque page InnoDB est marquée d'un LSN. Lorsque PXB effectue une sauvegarde incrémentielle, il n'enregistre que les pages dont le LSN est supérieur au LSN enregistré au moment de la sauvegarde précédente.
Crucialement, les sauvegardes incrémentielles nécessitent une sauvegarde de base complète pour établir le point de départ. Toutes les sauvegardes incrémentielles ultérieures sont chaînées, faisant référence à la sauvegarde immédiatement précédente (qui peut être la sauvegarde de base ou une autre sauvegarde incrémentielle).
Fichiers et concepts clés
- LSN (Log Sequence Number) : Le marqueur utilisé pour déterminer où les modifications commencent et se terminent.
- xtrabackup_checkpoints : Un fichier créé lors de chaque sauvegarde contenant le
to_lsn(le LSN atteint à la fin de la sauvegarde) et, pour les sauvegardes incrémentielles, lefrom_lsn(le LSN de départ). --incremental-basedir: Le drapeau essentiel utilisé lors des exécutions incrémentielles, pointant PXB vers le répertoire de la sauvegarde précédente (qui détermine le LSN de départ).
Étape 1 : Effectuer la sauvegarde de base complète
Avant de prendre des instantanés incrémentiels, une sauvegarde de base complète et cohérente doit être créée. Cela établit la base de toute la chaîne de sauvegarde.
Nous allons d'abord définir notre structure de répertoire :
# Définir le répertoire de base pour la sauvegarde complète
BASE_DIR="/data/backups/2023-10-01_FULL"
# Créer le répertoire
mkdir -p $BASE_DIR
# Exécuter la sauvegarde complète
xtrabackup --backup \n --target-dir=$BASE_DIR \n --user=root --password=secret_password \n --datadir=/var/lib/mysql
# Vérifier le LSN de la sauvegarde complète
cat $BASE_DIR/xtrabackup_checkpoints | grep 'to_lsn'
Remarque : Le
target-dirdoit être vide ou inexistant au début du processus de sauvegarde. Utilisez toujours des identifiants disposant des autorisations appropriées (par exemple, privilègesRELOAD,LOCK TABLES,PROCESS,SUPER).
Étape 2 : Effectuer la première sauvegarde incrémentielle
Pour effectuer la première sauvegarde incrémentielle, nous devons référencer le répertoire de la sauvegarde de base complète à l'aide du drapeau --incremental-basedir. PXB lira le to_lsn de la sauvegarde de base et ne copiera que les pages qui ont été modifiées depuis ce point.
# Définir le répertoire pour la première sauvegarde incrémentielle
INCREMENTAL_1_DIR="/data/backups/2023-10-02_INC1"
# Exécuter la sauvegarde incrémentielle, en référençant la base complète
xtrabackup --backup \n --target-dir=$INCREMENTAL_1_DIR \n --incremental-basedir=/data/backups/2023-10-01_FULL \n --user=root --password=secret_password
Étape 3 : Chaîner les sauvegardes incrémentielles ultérieures
Pour toute sauvegarde incrémentielle ultérieure (INC2, INC3, etc.), le --incremental-basedir doit pointer vers le répertoire de sauvegarde incrémentielle immédiatement précédente.
Si nous voulons créer INC2 basé sur les modifications depuis INC1 :
# Définir le répertoire pour la deuxième sauvegarde incrémentielle
INCREMENTAL_2_DIR="/data/backups/2023-10-03_INC2"
# Exécuter la sauvegarde incrémentielle, en référençant l'incrémentielle précédente (INC1)
xtrabackup --backup \n --target-dir=$INCREMENTAL_2_DIR \n --incremental-basedir=/data/backups/2023-10-02_INC1 \n --user=root --password=secret_password
Cette chaînage se poursuit tant que vous maintenez la séquence. Si un maillon de la chaîne est brisé (c'est-à-dire qu'un répertoire est manquant), le processus de restauration échouera.
Restauration : Application des modifications incrémentielles
La restauration d'un ensemble de sauvegardes incrémentielles est un processus en plusieurs étapes impliquant l'application des modifications séquentiellement à la sauvegarde de base. Contrairement à une sauvegarde complète, les sauvegardes incrémentielles ne peuvent pas être copiées directement dans le répertoire de données.
Phase de restauration 1 : Préparation de la sauvegarde de base
Tout d'abord, la sauvegarde de base doit être préparée. Ceci est généralement effectué dans une zone de staging temporaire pour assurer la sécurité des données.
Lors de la préparation de la sauvegarde de base, PXB effectue deux actions essentielles :
1. Applique les transactions validées (le redo log).
2. Annule les transactions non validées.
Nous utilisons le drapeau --prepare, mais de manière critique, nous ajoutons le drapeau --apply-log-only. Cela empêche PXB d'annuler les transactions non validées, ce qui est nécessaire car les logs incrémentiels suivants ont besoin de ces fragments de transaction pour compléter la restauration.
# Définir le répertoire de staging
RESTORE_TARGET="/data/restore_staging"
# Copier les fichiers de sauvegarde de base complète dans la zone de staging
rsync -avr /data/backups/2023-10-01_FULL/ $RESTORE_TARGET
# Préparer la sauvegarde de base, la gardant prête pour les incréments
xtrabackup --prepare --target-dir=$RESTORE_TARGET --apply-log-only
# Rechercher la confirmation : 'completed OK!'
Phase de restauration 2 : Application séquentielle des sauvegardes incrémentielles
Ensuite, appliquez chaque sauvegarde incrémentielle dans l'ordre chronologique exact où elles ont été effectuées. Chaque commande doit référencer le répertoire de staging (la sauvegarde de base en cours de modification) et utiliser le drapeau --incremental-dir pointant vers l'instantané incrémentiel spécifique.
# Appliquer l'incrémentielle 1
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-02_INC1 \n --apply-log-only
# Appliquer l'incrémentielle 2
xtrabackup --prepare --target-dir=$RESTORE_TARGET \n --incremental-dir=/data/backups/2023-10-03_INC2 \n --apply-log-only
# ... continuer pour tous les incréments requis ...
Phase de restauration 3 : Finalisation de la préparation
Une fois la dernière sauvegarde incrémentielle souhaitée appliquée, exécutez l'étape de préparation finale sans le drapeau --apply-log-only. Cela permet à PXB d'effectuer le nettoyage final, en annulant toutes les transactions qui étaient encore non validées sur l'ensemble de la séquence de sauvegarde, résultant en un état cohérent.
# Finaliser la préparation (sans --apply-log-only)
xtrabackup --prepare --target-dir=$RESTORE_TARGET
# IMPORTANT : Rechercher la confirmation finale indiquant 'xtrabackup: Recovery completed OK!'
Phase de restauration 4 : Copie des données vers MySQL
Après une préparation réussie, les données du répertoire de staging ($RESTORE_TARGET) sont cohérentes et prêtes à être utilisées par le serveur MySQL.
- Arrêtez le service MySQL.
- Assurez-vous que le répertoire de données MySQL est vide ou sauvegardé (facultatif : utilisez l'option
--move-backsi autorisé, mais--copy-backest plus sûr pour la récupération). - Utilisez
xtrabackup --copy-backpour déplacer les fichiers. - Corrigez les permissions.
- Redémarrez MySQL.
# Arrêter le service MySQL
service mysql stop
# Copier les fichiers préparés dans le répertoire de données MySQL
xtrabackup --copy-back --target-dir=$RESTORE_TARGET
# Assurer la propriété appropriée pour les fichiers
chown -R mysql:mysql /var/lib/mysql
# Démarrer MySQL
service mysql start
Bonnes pratiques pour la gestion des sauvegardes incrémentielles
Automatisation et script
Les stratégies de sauvegarde incrémentielle sont plus efficaces lorsqu'elles sont entièrement automatisées. Les scripts doivent gérer la chaînage des LSN automatiquement, en identifiant dynamiquement le répertoire de sauvegarde le plus récent à utiliser pour le drapeau --incremental-basedir.
Politique de rétention
Les chaînes incrémentielles peuvent devenir très longues, rendant la restauration lente. Une bonne pratique courante est la stratégie Grandfather-Father-Son (GFS) ou les sauvegardes incrémentielles différentielles (où tous les incréments référencent la base complète). Périodiquement, faites pivoter la chaîne en effectuant une nouvelle sauvegarde complète pour démarrer une nouvelle chaîne courte.
Compression et limitation
Pour les serveurs très sollicités, envisagez d'utiliser l'option --throttle pendant la phase de sauvegarde pour limiter les opérations d'E/S. Utilisez --compress pour réduire la taille de la sauvegarde, ce qui est très bénéfique pour les ensembles de données plus petits générés par les sauvegardes incrémentielles.
# Exemple avec compression et limitation
xtrabackup --backup \n --target-dir=$INCREMENTAL_3_DIR \n --incremental-basedir=$INCREMENTAL_2_DIR \n --compress \n --throttle=100
Vérification et surveillance
Testez toujours vos procédures de restauration régulièrement. Une sauvegarde qui ne peut pas être restaurée est inutile. Surveillez l'espace disque consommé par votre chaîne incrémentielle, en particulier avant de lancer une nouvelle sauvegarde de base complète.