Configuration des sauvegardes incrémentielles MySQL avec Percona XtraBackup

Maîtrisez l'art des sauvegardes MySQL à haute efficacité en utilisant les instantanés incrémentiels de Percona XtraBackup (PXB). Ce guide complet détaille les étapes cruciales pour la configuration, l'exécution et la restauration de sauvegardes incrémentielles séquentielles basées sur le suivi LSN. Apprenez à effectuer la première sauvegarde complète de base, à chaîner correctement les incréments suivants à l'aide de `--incremental-basedir`, et à naviguer dans le processus de restauration en plusieurs phases, assurant un temps d'arrêt minimal et une gestion optimale du stockage pour les grandes bases de données.

51 vues

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, le from_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-dir doit être vide ou inexistant au début du processus de sauvegarde. Utilisez toujours des identifiants disposant des autorisations appropriées (par exemple, privilèges RELOAD, 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.

  1. Arrêtez le service MySQL.
  2. Assurez-vous que le répertoire de données MySQL est vide ou sauvegardé (facultatif : utilisez l'option --move-back si autorisé, mais --copy-back est plus sûr pour la récupération).
  3. Utilisez xtrabackup --copy-back pour déplacer les fichiers.
  4. Corrigez les permissions.
  5. 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.