Categories
Database Backup

** Discover how DevOps engineers and DBAs can detect corrupted database backups before disaster strikes. Learn advanced techniques for PostgreSQL, SQL Server, and MySQL, including automated restore testing and checksum validation.

Dans le monde aux enjeux élevés de l’administration de bases de données et de l’ingénierie de la fiabilité des sites (SRE), il existe un axiome bien connu : la sauvegarde de Schrödinger. L’état de toute sauvegarde est inconnu tant que vous n’avez pas tenté de la restaurer. Jusqu’à ce moment, elle existe dans un état quantique où elle est à la fois parfaitement viable et totalement corrompue.

Pour les ingénieurs DevOps et les administrateurs de bases de données (DBA), découvrir qu’une sauvegarde critique est corrompue lors d’un incident actif est le scénario catastrophe ultime. Cela transforme une opération de récupération de routine en un événement de perte de données catastrophique. Ce « tueur silencieux » de l’intégrité des données passe souvent inaperçu car les tâches de sauvegarde signalent fréquemment un Code de sortie 0 réussi, même lorsque la charge utile sous-jacente est compromise.

Dans ce guide complet, nous disséquerons l’anatomie de la corruption des sauvegardes, explorerons des techniques de validation spécifiques aux bases de données et démontrerons comment construire des pipelines de restauration automatisés et infaillibles pour les environnements de production.

L’anatomie de la corruption des sauvegardes

Pour détecter la corruption, vous devez d’abord comprendre comment elle se produit. La corruption des sauvegardes se divise généralement en deux catégories : physique (au niveau de l’infrastructure) et logique (au niveau de l’application).

Corruption physique

La corruption physique se produit lorsque les bits réels sur le support de stockage sont altérés. Cela peut arriver pendant le processus de lecture depuis le disque source, pendant le transit réseau ou au repos sur le stockage cible.
* Bit Rot (détérioration des bits) : La dégradation progressive des supports de stockage peut inverser des bits silencieusement.
* Erreurs de transit : Bien que TCP possède des sommes de contrôle, elles sont notoirement faibles (16 bits). Les environnements à haut débit peuvent subir une corruption silencieuse des données sur le réseau que TCP ne parvient pas à détecter.
* Défauts du contrôleur de stockage : Des bogues matériels dans les contrôleurs RAID ou les structures SAN peuvent écrire des données corrompues tout en signalant un succès au système d’exploitation.

Corruption logique

La corruption logique est sans doute plus dangereuse car le fichier de sauvegarde lui-même est parfaitement intact, mais les données qu’il contient sont brisées.
* Garbage In, Garbage Out (GIGO) : Si votre base de données en direct possède un index corrompu ou une page déchirée, votre outil de sauvegarde pourrait copier fidèlement cette page corrompue. La tâche de sauvegarde réussit, mais la restauration échouera ou produira une base de données cassée.
* Transactions incomplètes : Les instantanés au niveau du système de fichiers pris sans geler correctement les E/S de la base de données (par exemple, sans utiliser FLUSH TABLES WITH READ LOCK dans MySQL) entraînent des pages déchirées et des états irrécupérables.

Détection proactive : sommes de contrôle et hachage cryptographique

La première ligne de défense contre la corruption physique est la validation cryptographique. Se fier à la taille des fichiers ou aux dates de modification est insuffisant.

Activation des sommes de contrôle au niveau de la base de données

Les systèmes de gestion de bases de données relationnelles (SGBDR) modernes prennent en charge les sommes de contrôle au niveau des pages. Lorsqu’elles sont activées, la base de données calcule une somme de contrôle pour chaque page avant de l’écrire sur le disque. Lorsque la page est lue (soit par une requête, soit par un processus de sauvegarde), la somme de contrôle est vérifiée.

Pour PostgreSQL, vous pouvez activer les sommes de contrôle des données lors de l’initialisation du cluster :

# Initialiser un nouveau cluster PostgreSQL avec les sommes de contrôle activées
initdb --data-checksums -D /var/lib/postgresql/data

Note : Si vous avez un cluster PostgreSQL existant, vous pouvez utiliser l’utilitaire pg_checksums pour les activer hors ligne.

Pour Microsoft SQL Server, assurez-vous que PAGE_VERIFY est défini sur CHECKSUM (la valeur par défaut dans les versions modernes, mais il vaut la peine de le vérifier sur les systèmes hérités) :

ALTER DATABASE [ProductionDB] SET PAGE_VERIFY CHECKSUM;
GO

Validation des sauvegardes au repos

Une fois que la sauvegarde arrive sur votre cible de stockage, son intégrité doit être vérifiée cryptographiquement. Les plateformes de sauvegarde d’entreprise comme CloudSave calculent et vérifient automatiquement les hachages SHA-256 des blocs de sauvegarde pendant le transit et au repos. Si vous gérez des scripts personnalisés, vous devez implémenter cela manuellement :

# Générer le hachage SHA-256 après la création de la sauvegarde
sha256sum prod_db_backup.tar.gz > prod_db_backup.tar.gz.sha256

# Vérifier le hachage sur le serveur de stockage
sha256sum -c prod_db_backup.tar.gz.sha256

Techniques de validation spécifiques aux bases de données

Différents moteurs de base de données offrent des outils natifs pour vérifier l’intégrité de leurs artefacts de sauvegarde.

PostgreSQL : pg_verifybackup

Introduit dans PostgreSQL 13, pg_verifybackup change la donne pour les sauvegardes physiques effectuées avec pg_basebackup. Il lit le fichier backup_manifest généré pendant la sauvegarde et vérifie que tous les fichiers sont présents et que leurs sommes de contrôle correspondent.

# Exécuter la vérification sur un répertoire de sauvegarde physique de base
pg_verifybackup /mnt/backups/postgres/base_backup_20231025/

Si un seul bit a été inversé dans l’un des fichiers de données, pg_verifybackup générera une erreur fatale, permettant à vos systèmes de surveillance d’alerter immédiatement l’équipe DBA.

Microsoft SQL Server : RESTORE VERIFYONLY

SQL Server fournit une commande native pour vérifier l’intégrité physique d’un fichier de sauvegarde sans réellement le restaurer. Elle vérifie les en-têtes de sauvegarde et valide les sommes de contrôle des pages (si elles étaient activées pendant la sauvegarde).

RESTORE VERIFYONLY 
FROM DISK = 'Z:BackupsProdDB_Full.bak' 
WITH CHECKSUM;

Attention : RESTORE VERIFYONLY confirme uniquement que le fichier de sauvegarde est lisible et que les sommes de contrôle physiques correspondent. Cela ne garantit pas l’intégrité logique. Pour garantir l’intégrité logique, vous devez effectuer une restauration complète et exécuter DBCC CHECKDB.

MySQL / InnoDB : Percona XtraBackup

Pour les environnements MySQL, les sauvegardes physiques sont souvent gérées par Percona XtraBackup. Le processus de sauvegarde consiste à copier des fichiers, mais la sauvegarde n’est cohérente qu’une fois les journaux de transaction (redo logs) appliqués. La phase --prepare agit comme une vérification d’intégrité intégrée.

# La préparation de la sauvegarde applique les redo logs. 
# Si la sauvegarde est corrompue, cette étape échouera.
xtrabackup --prepare --target-dir=/data/backups/mysql/

L’étalon-or : tests de restauration automatisés

Les sommes de contrôle et les commandes de vérification sont nécessaires, mais elles ne sont pas suffisantes. La seule façon de prouver définitivement qu’une sauvegarde est viable est de la restaurer. Dans les environnements DevOps modernes, ce processus doit être entièrement automatisé.

En traitant les sauvegardes comme du code, vous pouvez construire un pipeline CI/CD pour vos restaurations de base de données. Ce pipeline doit provisionner une infrastructure éphémère, exécuter la restauration, lancer des requêtes de validation et supprimer l’environnement.

Construction d’un pipeline de restauration automatisé

Voici un exemple de script Bash qui pourrait être déclenché quotidiennement par une tâche cron ou un exécuteur CI (comme GitLab CI ou GitHub Actions) pour valider un dump logique PostgreSQL.

#!/bin/bash
set -e

BACKUP_FILE="/mnt/storage/prod_db_latest.dump"
DB_NAME="prod_db"
CONTAINER_NAME="pg_restore_test"

echo "[INFO] Démarrage du test de restauration automatisé..."

# 1. Lancer un conteneur PostgreSQL éphémère
docker run --name $CONTAINER_NAME 
  -e POSTGRES_PASSWORD=testpass 
  -d postgres:15

# Attendre que PostgreSQL soit prêt
echo "[INFO] En attente de l'initialisation de la base de données..."
until docker exec $CONTAINER_NAME pg_isready -U postgres; do
  sleep 2
done

# 2. Créer la base de données cible
docker exec $CONTAINER_NAME psql -U postgres -c "CREATE DATABASE $DB_NAME;"

# 3. Exécuter la restauration
echo "[INFO] Restauration de la sauvegarde..."
docker cp $BACKUP_FILE $CONTAINER_NAME:/tmp/backup.dump
docker exec $CONTAINER_NAME pg_restore -U postgres -d $DB_NAME -1 /tmp/backup.dump

# 4. Exécuter des requêtes de validation logique
echo "[INFO] Exécution des requêtes de validation..."
# Vérifier si la table users contient plus de 10 000 enregistrements
USER_COUNT=$(docker exec $CONTAINER_NAME psql -U postgres -d $DB_NAME -t -c "SELECT COUNT(*) FROM users;")

if [ "$USER_COUNT" -lt 10000 ]; then
    echo "[ERROR] La validation logique a échoué. Attendu >10000 utilisateurs, trouvé $USER_COUNT"
    # Déclencher une alerte PagerDuty / Slack ici
    exit 1
else
    echo "[SUCCESS] Validation logique réussie. Nombre d'utilisateurs : $USER_COUNT"
fi

# 5. Supprimer l'environnement éphémère
echo "[INFO] Nettoyage..."
docker rm -f $CONTAINER_NAME

echo "[INFO] Test de restauration automatisé terminé avec succès."

Que devez-vous valider ?

Lors de l’exécution de tests de restauration automatisés, ne vous contentez pas de vérifier si la base de données démarre. Exécutez des requêtes de validation spécifiques à l’application :
1. Nombre de lignes : Assurez-vous que les tables principales ont le nombre de lignes attendu (par exemple, la table users ne devrait pas être vide).
2. Données récentes : Interrogez les enregistrements créés au cours des dernières 24 heures pour vous assurer que la sauvegarde n’est pas obsolète.
3. Intégrité référentielle : Exécutez des scripts pour vérifier les clés étrangères orphelines, qui indiquent une corruption logique.

Surveillance et alertes pour les anomalies de sauvegarde

Détecter la corruption avant qu’une catastrophe ne survienne nécessite une observabilité robuste. Au-delà des états binaires succès/échec, vous devez surveiller les métadonnées de vos tâches de sauvegarde pour détecter les anomalies.

Surveillance heuristique

Intégrez vos métadonnées de sauvegarde dans Prometheus et visualisez-les avec Grafana. Configurez des alertes pour les heuristiques suivantes :
* Chutes soudaines de taille : Si votre sauvegarde quotidienne est systématiquement de 500 Go et que la sauvegarde d’aujourd’hui est de 50 Mo, la tâche a peut-être été terminée avec succès (Code de sortie 0), mais elle a probablement sauvegardé un schéma vide.
* Anomalies de durée : Si une sauvegarde qui prend normalement 2 heures se termine en 5 minutes, quelque chose a été ignoré. Inversement, si elle prend 10 heures, vous pourriez avoir une dégradation des E/S disque qui pourrait conduire à une corruption.
* Accumulation de journaux WAL/Archive : Si votre base de données génère des journaux Write-Ahead (WAL) mais que le système de sauvegarde ne les archive pas assez rapidement, vous risquez une lacune dans votre chaîne de récupération à un point dans le temps (PITR).

Mise en œuvre de la règle 3-2-1 avec des contrôles d’intégrité

La règle de sauvegarde 3-2-1 standard de l’industrie (3 copies des données, 2 supports différents, 1 hors site) n’est efficace que si toutes les copies sont vérifiées.

C’est là que l’utilisation d’une solution d’entreprise comme CloudSave réduit considérablement la charge opérationnelle. Au lieu d’écrire et de maintenir des scripts bash complexes pour chaque nœud de base de données, CloudSave s’intègre directement à votre infrastructure pour automatiser le cycle de vie 3-2-1. Il fournit un stockage immuable — protégeant contre les ransomwares — et propose des programmes de vérification de restauration automatisés intégrés. CloudSave peut automatiquement lancer des environnements sandbox isolés, monter la sauvegarde, exécuter vos scripts de validation SQL personnalisés et renvoyer l’état de santé vers votre tableau de bord central.

Conclusion

Les sauvegardes de bases de données corrompues sont un tueur silencieux qui peut détruire des entreprises. Se fier uniquement au Code de sortie 0 d’un script de sauvegarde est un pari dangereux.

Pour protéger réellement vos environnements de production, vous devez adopter une stratégie de défense en profondeur :
1. Activez les sommes de contrôle au niveau des pages dans votre moteur de base de données.
2. Utilisez des outils de vérification natifs (pg_verifybackup, RESTORE VERIFYONLY) immédiatement après la création de la sauvegarde.
3. Surveillez les métadonnées de sauvegarde (taille, durée) pour détecter les anomalies heuristiques.
4. Implémentez des tests de restauration éphémères et automatisés dans le cadre de votre pipeline opérationnel quotidien.

En passant d’une mentalité de sauvegarde passive « définir et oublier » à un modèle actif de « validation de restauration continue », vous vous assurez que lorsque la catastrophe surviendra inévitablement, vos données seront prêtes, fiables et entièrement récupérables.