Categories
Database Backup

** Discover the hidden dangers of DIY database backup scripts. Learn why custom Bash scripts fail in production, the risks of logical dumps, and how to secure your data with enterprise solutions.

Chaque administrateur de base de données (DBA) et ingénieur système a, à un moment donné de sa carrière, écrit un script shell personnalisé pour sauvegarder une base de données. C’est pratiquement un rite de passage. Au début d’un projet, une simple tâche cron exécutant mysqldump ou pg_dump redirigée vers gzip semble être une solution élégante, légère et rentable.

Cependant, à mesure que l’infrastructure évolue, que les volumes de données augmentent et que les SLA de disponibilité deviennent plus stricts, ce script Bash de 10 lignes se transforme discrètement en une bombe à retardement. Les environnements de production exigent une haute disponibilité, des objectifs de point de récupération (RPO) stricts et des objectifs de temps de récupération (RTO) rapides. S’appuyer sur des scripts de sauvegarde « maison » dans ces environnements introduit des risques graves liés à la cohérence des données, aux échecs silencieux, aux vulnérabilités de sécurité et aux processus de récupération ingérables.

Dans cet article, nous disséquerons les failles architecturales et les dangers cachés des scripts de sauvegarde de base de données faits maison, explorerons les pièges techniques des sauvegardes logiques par rapport aux sauvegardes physiques, et discuterons de la manière de passer à des solutions de niveau entreprise comme CloudSave pour protéger vos données critiques.

L’illusion de la simplicité : disséquer le script classique fait maison

Pour comprendre le danger, nous devons d’abord examiner l’anatomie d’un script de sauvegarde fait maison typique. Une approche standard pour une base de données MySQL ressemble souvent à ceci :

#!/bin/bash
# Script de sauvegarde MySQL simple fait maison
BACKUP_DIR="/mnt/backups"
DATE=$(date +%F)
DB_USER="admin"
DB_PASS="SuperSecret123!"

mysqldump -u $DB_USER -p$DB_PASS my_database | gzip > $BACKUP_DIR/mydb_$DATE.sql.gz

# Supprimer les sauvegardes de plus de 30 jours
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -exec rm {} ;

À première vue, ce script atteint son objectif : il extrait les données, les compresse et gère la rétention. Mais sous la surface, il est criblé de failles critiques qui finiront par entraîner une perte de données dans un environnement de production.

Danger 1 : Les échecs silencieux et le piège du pipe

L’un des dangers les plus insidieux des scripts faits maison est l’échec silencieux. Dans le script ci-dessus, la commande mysqldump est redirigée (|) directement vers gzip.

En Bash, le code de sortie d’un pipeline est le code de sortie de la dernière commande du pipeline. Si le serveur de base de données manque de mémoire, perd la connexion ou rencontre une table verrouillée au milieu du dump, mysqldump échouera et renverra une erreur. Cependant, gzip compressera avec succès la sortie partielle qu’il a reçue et quittera avec un code de statut 0 (succès).

Votre système de surveillance, vérifiant le code de sortie de la tâche cron, signalera une sauvegarde réussie. Vous aurez un fichier .gz valide sur le disque, mais à l’intérieur se trouvera un fichier SQL tronqué et inutile. Vous ne le découvrirez que lorsque vous tenterez une restauration critique.

L’atténuation (et ses limites)

Les ingénieurs essaient souvent de corriger cela en activant une gestion stricte des erreurs dans Bash :

set -e
set -o pipefail

Bien que set -o pipefail garantisse que le script échoue si une quelconque commande du pipeline échoue, cela nécessite toujours de construire des mécanismes robustes d’alerte, de journalisation et de nouvelle tentative autour du script. Lorsqu’une erreur réseau transitoire provoque un échec à 2h00 du matin, un script fait maison s’arrête simplement. Les plateformes d’entreprise gèrent ces erreurs transitoires avec des tentatives intelligentes et exponentielles.

Danger 2 : Cohérence des données et cauchemars de verrouillage

Les scripts faits maison reposent fortement sur des sauvegardes logiques (mysqldump, pg_dump). Les sauvegardes logiques extraient les données en exécutant des instructions SELECT sur toutes les tables. Dans une base de données de production hautement transactionnelle, les données changent constamment. Si un script prend 45 minutes pour dumper une base de données de 100 Go, les données au début du dump auront 45 minutes de plus que les données à la fin, violant la conformité ACID.

Cohérence transactionnelle MySQL

Pour obtenir un instantané cohérent dans MySQL en utilisant InnoDB, vous devez passer des indicateurs spécifiques :

mysqldump --single-transaction --quick --routines --events -u user -p db > dump.sql

L’indicateur --single-transaction définit le niveau d’isolation sur REPEATABLE READ et démarre une transaction avant le dump. Cependant, si votre base de données contient encore des tables MyISAM héritées, cet indicateur n’empêchera pas leur verrouillage, arrêtant potentiellement le trafic de lecture/écriture de production pendant l’exécution de la sauvegarde. De plus, toute instruction ALTER TABLE, DROP TABLE ou RENAME TABLE exécutée par les développeurs pendant la sauvegarde brisera l’instantané REPEATABLE READ, provoquant l’échec du dump.

PostgreSQL et archivage WAL

Pour PostgreSQL, pg_dump fournit des sauvegardes logiques cohérentes, mais les sauvegardes logiques seules ne peuvent pas fournir de récupération ponctuelle (PITR). Si votre base de données tombe en panne à 16h00 et que votre dernier script cron a été exécuté à minuit, vous perdez 16 heures de données.

L’obtention du PITR nécessite l’archivage continu des journaux de transactions (WAL). Écrire un script fait maison pour gérer archive_command en toute sécurité est notoirement difficile.

# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /mnt/wal_archive/%f && cp %p /mnt/wal_archive/%f'

Si le stockage de destination (/mnt/wal_archive/) se remplit ou devient indisponible, la commande archive_command échouera. PostgreSQL accumulera alors les fichiers WAL localement jusqu’à ce que le disque principal soit plein, provoquant une panne complète de la base de données. Les scripts faits maison ont rarement la télémétrie nécessaire pour surveiller l’accumulation des WAL et alerter les administrateurs avant qu’une panne ne survienne.

Danger 3 : La roulette de la rétention

Revenez à la commande de rétention dans notre script initial :

find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +30 -exec rm {} ;

C’est un événement de perte de données catastrophique qui attend de se produire. Imaginez un scénario où un changement de configuration casse l’authentification mysqldump. Le script ne parvient pas à créer de nouvelles sauvegardes, mais la commande find continue de s’exécuter chaque nuit, supprimant consciencieusement les fichiers de plus de 30 jours.

Après 30 jours d’échecs de sauvegarde silencieux, la commande find supprimera votre dernière bonne sauvegarde restante. Vous vous retrouvez alors sans aucune sauvegarde.

Les logiciels de sauvegarde d’entreprise comme CloudSave utilisent des politiques de rétention avec état. Ils comprennent la différence entre « supprimer les sauvegardes de plus de 30 jours » et « s’assurer qu’au moins 30 points de récupération réussis existent avant de supprimer les anciennes données ».

Danger 4 : Sécurité, chiffrement et angles morts de conformité

À l’ère des ransomwares et des cadres de conformité stricts (RGPD, HIPAA, SOC 2), les sauvegardes sont une cible privilégiée. Les scripts faits maison violent fréquemment les meilleures pratiques de sécurité :

  1. Identifiants codés en dur : Stocker les mots de passe de base de données dans des scripts en texte brut ou des définitions cron est un risque de sécurité majeur. Bien que des outils comme mysql_config_editor de MySQL ou le fichier .pgpass de PostgreSQL atténuent cela, ils nécessitent toujours la gestion de fichiers de clés locaux sur le serveur.
  2. Absence de chiffrement au repos : Dumper du SQL brut sur un disque laisse les PII/PHI sensibles exposés.
  3. Pipelines de chiffrement complexes : Tenter de chiffrer les sauvegardes à la volée en utilisant GPG introduit une surcharge CPU importante et des complexités de gestion des clés.
# Un pipeline de sauvegarde chiffré fait maison
pg_dump mydb | gzip | gpg --symmetric --cipher-algo AES256 --passphrase-file /etc/keys/backup.key > backup.sql.gz.gpg

Si le serveur est compromis, l’attaquant a accès à la fois à la sauvegarde chiffrée et au fichier /etc/keys/backup.key, rendant le chiffrement inutile. De plus, si le DBA qui a généré la clé GPG quitte l’entreprise et que la clé est perdue, les sauvegardes sont irrécupérables.

Danger 5 : Le test de réalité du RTO (Restaurer est plus difficile que sauvegarder)

Le test ultime d’une sauvegarde est la restauration. Les sauvegardes logiques générées par des scripts faits maison sont notoirement lentes à restaurer. Un dump SQL de 500 Go peut prendre 15 minutes à créer, mais sa restauration nécessite que le moteur de base de données analyse le SQL, reconstruise les index et recalcule les contraintes. Cela peut prendre des heures, voire des jours, anéantissant votre RTO.

Pour les grandes bases de données de production, les sauvegardes physiques (copie des fichiers de données réels) sont obligatoires. Bien que des outils comme Percona XtraBackup ou pg_basebackup existent, les envelopper dans des scripts Bash faits maison est très complexe. Vous devez gérer les instantanés LVM, gérer la mise en veille du système de fichiers et vous assurer que la sauvegarde est transférée hors site sans saturer l’interface réseau.

Le piège de l’instantané LVM

De nombreux ingénieurs tentent des sauvegardes physiques « sans temps d’arrêt » en utilisant des instantanés LVM :

# Créer un instantané
lvcreate --size 20G --snapshot --name db_snap /dev/vg0/db_vol

# Monter et copier
mount /dev/vg0/db_snap /mnt/snap
tar -czf /backups/db_physical.tar.gz /mnt/snap/mysql

Si la base de données subit une augmentation soudaine des E/S d’écriture, l’instantané LVM de 20 Go peut se remplir instantanément. Lorsqu’un instantané LVM se remplit, il devient invalide et la sauvegarde échoue. Pire encore, les instantanés LVM fortement utilisés peuvent dégrader gravement les performances d’E/S du volume de base de données principal, provoquant des pics de latence de l’application.

Transition vers une protection de niveau entreprise

La transition des scripts faits maison vers une plateforme d’entreprise est une étape de maturité critique pour toute équipe d’infrastructure. L’objectif est de passer de « espérer que le script s’est exécuté » à avoir une preuve cryptographique de récupérabilité.

Des plateformes comme CloudSave sont conçues spécifiquement pour éliminer les angles morts des scripts faits maison. En déployant des agents conscients des applications, CloudSave interagit directement avec les API de base de données (MySQL, PostgreSQL, MS SQL, Oracle) pour orchestrer des sauvegardes physiques et logiques cohérentes sans verrouiller les tables ni dégrader les performances.

Avantages clés de l’abandon des scripts :

  1. Vérification automatisée : Les plateformes modernes ne se contentent pas de faire des sauvegardes ; elles les testent. CloudSave peut automatiquement démarrer une instance de base de données temporaire, restaurer la sauvegarde, exécuter des vérifications de cohérence (par exemple, DBCC CHECKDB), et la supprimer, fournissant un rapport vérifié que la sauvegarde est réellement utilisable.
  2. Stockage immuable : Pour lutter contre les ransomwares, les sauvegardes doivent être immuables. Les scripts faits maison ne peuvent pas facilement écrire sur un stockage WORM (Write Once, Read Many). Les solutions d’entreprise s’intègrent nativement avec S3 Object Lock et le stockage cloud immuable, garantissant que même si un serveur est totalement compromis, les sauvegardes ne peuvent pas être supprimées ou chiffrées par un attaquant.
  3. PITR simplifié : Au lieu d’assembler manuellement une sauvegarde de base et des centaines de fichiers WAL en utilisant des paramètres complexes recovery.conf ou postgresql.auto.conf, les plateformes fournissent une chronologie visuelle. Vous sélectionnez simplement la minute exacte à laquelle vous souhaitez restaurer, et le logiciel gère automatiquement la relecture des journaux.
  4. Déduplication et compression : Les scripts faits maison reposent sur gzip, qui compresse chaque fichier individuellement. Les logiciels de sauvegarde d’entreprise utilisent la déduplication globale au niveau des blocs, réduisant considérablement les coûts de stockage et la bande passante réseau lors du transfert des sauvegardes hors site.

Conclusion

Écrire un script Bash personnalisé pour sauvegarder une base de données est facile. Écrire un script qui gère les échecs de pipeline silencieux, garantit la cohérence ACID, gère les clés cryptographiques en toute sécurité, empêche la perte de données basée sur la rétention et garantit des SLA RTO/RPO stricts est presque impossible.

Dans les environnements de production, la base de données est l’actif le plus critique de l’entreprise. Traiter sa protection comme un projet secondaire maintenu par quelques centaines de lignes de script shell est un risque qu’aucune entreprise ne peut se permettre. En auditant vos stratégies de sauvegarde actuelles, en comprenant les limites des dumps logiques et en migrant vers des plateformes robustes et automatisées comme CloudSave, les équipes DevOps et DBA peuvent éliminer le « facteur bus » des scripts personnalisés et garantir que leurs données sont réellement résilientes.

Catégories