Categories
Database Backup

** Discover why mysqldump fails large MySQL databases and learn how to implement enterprise-grade physical backups using Percona XtraBackup and CloudSave to drastically reduce your RTO.

Pendant des décennies, mysqldump a été le couteau suisse incontesté pour les sauvegardes de bases de données MySQL. Il est omniprésent, simple et préinstallé avec chaque distribution MySQL et MariaDB. Pour les bases de données de petite à moyenne taille, il fonctionne admirablement bien.

Cependant, à mesure que les organisations se développent et que les jeux de données dépassent les seuils de 100 Go, 500 Go ou plusieurs téraoctets, s’appuyer sur mysqldump passe d’une bonne pratique à une vulnérabilité architecturale critique. Si vous êtes un administrateur de base de données (DBA) ou un ingénieur DevOps gérant des bases de données de production à grande échelle, vous avez probablement déjà fait l’expérience des échecs silencieux, de la dégradation des performances en production et des objectifs de temps de récupération (RTO) inacceptables associés aux sauvegardes logiques.

Dans cet article, nous disséquerons les limites architecturales de mysqldump, explorerons pourquoi il échoue à grande échelle et détaillerons comment mettre en œuvre des stratégies de sauvegarde physique de niveau entreprise pour protéger vos données critiques.

Les limites architecturales de mysqldump

Pour comprendre pourquoi mysqldump échoue à grande échelle, nous devons examiner son fonctionnement interne. mysqldump effectue des sauvegardes logiques. Il interroge le moteur de base de données, lit les données et les traduit en une série d’instructions SQL (principalement CREATE TABLE et INSERT INTO).

Bien que cela crée un fichier hautement portable et lisible par l’homme, cela introduit des goulots d’étranglement sévères dans les environnements à haut débit.

1. Le goulot d’étranglement monothread

Par conception, mysqldump est une opération monothread. Il traite une table à la fois, ligne par ligne. Alors que le matériel moderne dispose de dizaines de cœurs CPU et d’un stockage NVMe capable d’un débit de plusieurs gigaoctets par seconde, mysqldump n’utilise qu’une fraction de ces ressources.

Même en utilisant les options standard pour les tables InnoDB :

mysqldump -u root -p --single-transaction --routines --triggers --events --quick production_db > backup.sql

L’option --quick force mysqldump à récupérer les lignes une par une plutôt que de mettre en mémoire tampon la table entière, ce qui évite les erreurs de mémoire insuffisante (OOM) côté client. Cependant, la nature monothread signifie qu’une base de données de 500 Go pourrait prendre 10 à 15 heures pour être sauvegardée, impactant gravement votre objectif de point de récupération (RPO).

2. Pollution du pool de tampons InnoDB

Lorsque mysqldump lit chaque ligne de chaque table, il force le moteur MySQL à charger ces données du disque vers le pool de tampons (buffer pool) InnoDB. Dans un environnement de production, votre pool de tampons est soigneusement rempli avec votre jeu de données de travail « chaud ».

Une sauvegarde logique massive va balayer le pool de tampons, expulsant les index et les pages de données fréquemment consultés pour faire de la place aux données froides en cours de sauvegarde. Cela entraîne une augmentation soudaine et massive des entrées/sorties disque, car les requêtes de production sont forcées de lire sur le disque, ce qui conduit à une latence sévère de l’application.

3. Verrous de métadonnées et conflits DDL

Pour maintenir la cohérence, les DBA s’appuient sur l’option --single-transaction, qui définit le niveau d’isolation de la transaction sur REPEATABLE READ et démarre une transaction avant de sauvegarder les données.

Bien que cela évite les verrous de lecture au niveau de la table (FLUSH TABLES WITH READ LOCK), cela ne protège pas contre les changements de langage de définition de données (DDL). Si une commande ALTER TABLE, DROP TABLE ou TRUNCATE TABLE est exécutée sur une table pendant que mysqldump est en cours d’exécution, la sauvegarde échouera avec une erreur table definition has changed, please retry transaction. Dans les environnements CI/CD avec des migrations de schéma fréquentes, cela provoque des échecs de sauvegarde continus.

4. Le cauchemar du RTO : temps de restauration

L’échec le plus catastrophique de mysqldump ne se réalise pas pendant la sauvegarde, mais pendant la restauration.

Restaurer une sauvegarde logique nécessite que le moteur MySQL analyse et exécute des millions d’instructions INSERT. Pour chaque ligne insérée, MySQL doit :
* Vérifier les contraintes (clés étrangères, clés uniques).
* Reconstruire les index secondaires à la volée.
* Écrire dans le journal de restauration (redo log) InnoDB.
* Écrire dans le journal binaire (binlog) (si activé).

Restaurer une base de données de 1 To à partir d’une sauvegarde logique peut prendre plusieurs jours. Si votre entreprise a un RTO de 4 heures, mysqldump garantit que vous ne respecterez pas votre accord de niveau de service (SLA).

Alternatives de niveau entreprise : passer aux sauvegardes physiques

Pour obtenir des sauvegardes et des restaurations rapides pour de grands jeux de données, vous devez abandonner les sauvegardes logiques au profit des sauvegardes physiques.

Les sauvegardes physiques contournent entièrement le moteur d’exécution SQL de MySQL. Au lieu de cela, elles copient les fichiers de données binaires sous-jacents (les fichiers .ibd, les redo logs et les undo logs) directement depuis le système de fichiers. Comme il s’agit simplement de copier des fichiers, elles peuvent fonctionner à la vitesse de lecture/écriture séquentielle maximale de votre matériel de stockage et peuvent être fortement parallélisées.

Percona XtraBackup : la norme de l’industrie

Pour les moteurs InnoDB et XtraDB, Percona XtraBackup est le principal outil de sauvegarde physique open source. Il effectue des sauvegardes à chaud, sans blocage, des bases de données MySQL.

Comment fonctionne XtraBackup

  1. Copie des données : XtraBackup commence à copier les fichiers de données InnoDB (.ibd).
  2. Suivi des journaux : Comme la base de données est active, les données changeront pendant que les fichiers sont copiés. XtraBackup génère un thread en arrière-plan qui surveille et copie le journal de restauration InnoDB (ib_logfile0, etc.) pour toutes les transactions qui se produisent pendant la fenêtre de sauvegarde.
  3. Préparation (récupération après incident) : Après la sauvegarde, les fichiers de données copiés sont dans un état incohérent. XtraBackup applique les journaux de restauration copiés aux fichiers de données (similaire à la façon dont MySQL effectue la récupération après incident au démarrage), ce qui donne un instantané parfaitement cohérent de la base de données au moment exact où la sauvegarde s’est terminée.

Mise en œuvre d’une stratégie de sauvegarde physique

Voici une procédure technique pour mettre en œuvre une stratégie de sauvegarde physique utilisant Percona XtraBackup.

Étape 1 : Streaming de la sauvegarde

Écrire une sauvegarde massive sur le disque local cause souvent des problèmes de capacité. La meilleure pratique consiste à streamer la sauvegarde directement vers un format d’archive, à la compresser et à l’envoyer vers une zone de transit ou directement vers une plateforme de sauvegarde.

En utilisant xbstream, nous pouvons paralléliser la sauvegarde et la compresser à la volée :

xtrabackup --backup 
  --user=backup_user 
  --password=SecurePassword! 
  --parallel=4 
  --stream=xbstream | lz4 > /mnt/backups/mysql_prod_backup.xbstream.lz4
  • --parallel=4 : Utilise 4 threads pour lire les fichiers de données simultanément.
  • --stream=xbstream : Sort la sauvegarde dans le format de streaming personnalisé de Percona.
  • lz4 : Fournit une compression extrêmement rapide et peu gourmande en CPU.

Étape 2 : Préparation de la sauvegarde pour la restauration

Avant qu’une sauvegarde physique puisse être restaurée, elle doit être « préparée » (application des journaux de restauration). Tout d’abord, extrayez et décompressez le flux :

mkdir -p /data/restore
lz4 -d /mnt/backups/mysql_prod_backup.xbstream.lz4 | xbstream -x -C /data/restore

Ensuite, exécutez la phase de préparation. Cette étape nécessite de la mémoire, assurez-vous donc que le serveur dispose d’une RAM adéquate :

xtrabackup --prepare --use-memory=4G --target-dir=/data/restore

Étape 3 : Restauration de la base de données

Pour restaurer, le répertoire de données MySQL cible doit être complètement vide. Arrêtez le service MySQL, videz le répertoire et copiez les fichiers :

systemctl stop mysql
rm -rf /var/lib/mysql/*

xtrabackup --copy-back --target-dir=/data/restore

Enfin, corrigez les permissions du système de fichiers avant de démarrer le service :

chown -R mysql:mysql /var/lib/mysql
systemctl start mysql

Comme les fichiers de données sont déjà construits et que les index sont déjà compilés, la base de données démarre immédiatement. Une restauration qui prenait 48 heures avec mysqldump ne prend désormais que le temps nécessaire pour copier les fichiers sur votre réseau ou votre disque, réduisant souvent le RTO à quelques minutes.

Optimisation des restaurations logiques (lorsque vous devez les utiliser)

Si vous êtes contraint de restaurer une sauvegarde logique volumineuse (par exemple, lors d’une migration entre différentes versions majeures de MySQL ou différentes architectures CPU où les fichiers physiques sont incompatibles), vous devez temporairement ajuster votre configuration MySQL pour optimiser le débit d’écriture massif.

Appliquez ces paramètres à votre my.cnf avant de commencer la restauration logique :

[mysqld]
# Désactiver temporairement le binlogging s'il s'agit d'une restauration autonome
disable_log_bin

# Retarder l'écriture sur le disque pour maximiser la vitesse d'écriture
innodb_flush_log_at_trx_commit = 2

# Augmenter le pool de tampons pour contenir autant que possible le jeu de travail
innodb_buffer_pool_size = <Définir à 70 % de la RAM totale>

# Augmenter la taille du fichier journal pour éviter un point de contrôle agressif
innodb_log_file_size = 2G

# Désactiver le tampon double écriture (risqué pour la prod, sûr pour le chargement initial)
innodb_doublewrite = 0

Note : Revenez toujours à ces paramètres par défaut conformes ACID (innodb_flush_log_at_trx_commit = 1, innodb_doublewrite = 1) et redémarrez le service MySQL avant d’autoriser le trafic de production.

Automatisation et sécurisation des sauvegardes avec CloudSave

Bien que des outils comme Percona XtraBackup résolvent la mécanique de l’extraction efficace des données, une véritable stratégie de reprise après sinistre en entreprise nécessite une orchestration, un stockage hors site sécurisé et une gestion du cycle de vie. S’appuyer sur des scripts bash personnalisés et des tâches cron pour gérer les sauvegardes physiques introduit un risque élevé d’échecs silencieux et de violations de conformité.

C’est là que l’intégration de votre couche de base de données avec une plateforme d’entreprise comme CloudSave devient critique.

CloudSave fait le pont entre les utilitaires de base de données bruts et la conformité d’entreprise. En utilisant les capacités de pré- et post-scripting de CloudSave, les équipes DevOps peuvent déclencher XtraBackup pour générer un instantané physique cohérent. CloudSave ingère ensuite de manière transparente le flux de sauvegarde, applique un chiffrement AES-256 et déduplique les données avant de les répliquer vers un stockage cloud immuable.

Cette architecture garantit que :
1. Les performances de production sont maintenues : Les sauvegardes s’exécutent aux vitesses de stockage sans polluer le pool de tampons InnoDB.
2. Protection contre les ransomwares : Les politiques de stockage immuable au sein de CloudSave empêchent les acteurs malveillants de supprimer ou de chiffrer vos archives de base de données.
3. Rétention automatisée : Les politiques de rétention Grand-père-Père-Fils (GFS) sont gérées automatiquement, garantissant la conformité avec les exigences de souveraineté des données et d’audit.
4. RTO prévisible : Comme CloudSave gère les archives de fichiers physiques, la restauration d’une base de données de plusieurs téraoctets vers une nouvelle instance peut être orchestrée rapidement, atteignant des objectifs RTO stricts.

Conclusion

Continuer à utiliser mysqldump pour les bases de données à grande échelle est un pari risqué pour la disponibilité et l’intégrité des données de votre organisation. La nature monothread, la pollution du pool de tampons et les temps de restauration catastrophiques le rendent fondamentalement inadapté aux environnements modernes à haut débit.

En passant aux sauvegardes physiques à l’aide d’outils comme Percona XtraBackup, et en orchestrant le cycle de vie, le chiffrement et la réplication hors site via une plateforme robuste comme CloudSave, vous transformez votre stratégie de sauvegarde de base de données d’une responsabilité fragile en un atout résilient de niveau entreprise. Évaluez vos métriques RTO et RPO actuelles dès aujourd’hui : si une restauration prend plus de temps que ce que votre entreprise peut se permettre d’être hors ligne, il est temps de laisser mysqldump derrière vous.