Skip to content
VDS · Bases de données

Sauvegardes de bases de données

Comment planifier les dumps MySQL et PostgreSQL, les déplacer hors de la machine et vérifier que la sauvegarde se restaure réellement.

Mis à jour le 23 août 2026

Un VPS n'est pas livré avec des sauvegardes automatiques ni des snapshots d'état : tout ce que vous n'avez pas copié vous-même n'existe qu'en un seul exemplaire. Un dump de base de données est la première chose à mettre en place, car il n'y a nulle part où restaurer les données, alors que le site peut être redéployé à partir de zéro.

Dump manuel

PostgreSQL :

pg_dump -Fc -U shop -h 127.0.0.1 shop > /srv/backups/shop-$(date +%F).dump
pg_dumpall -U postgres --roles-only > /srv/backups/roles.sql

MySQL et MariaDB :

mysqldump --single-transaction --quick --routines --events \
  -u root shop | gzip > /srv/backups/shop-$(date +%F).sql.gz

--single-transaction produit un dump InnoDB cohérent sans verrouiller les tables — sans cette option, votre site se figera pendant l'export. Le format -Fc de PostgreSQL est compressé et permet de restaurer des tables individuelles.

Ne mettez pas les mots de passe sur la ligne de commande : créez ~/.pgpass ou ~/.my.cnf avec des permissions 600.

Planification

mkdir -p /srv/backups && chmod 700 /srv/backups
crontab -e
20 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

Le script /usr/local/bin/db-backup.sh :

#!/bin/bash
set -euo pipefail
DEST=/srv/backups
STAMP=$(date +%F-%H%M)
pg_dump -Fc -U shop -h 127.0.0.1 shop > "$DEST/shop-$STAMP.dump.tmp"
mv "$DEST/shop-$STAMP.dump.tmp" "$DEST/shop-$STAMP.dump"
find "$DEST" -name '*.dump' -mtime +14 -delete

Écrire dans un fichier temporaire puis le renommer est important : si le dump est interrompu, vous ne confondrez pas un fichier tronqué avec une sauvegarde complète. set -euo pipefail arrête le script à la première erreur au lieu de continuer silencieusement.

Déplacer les sauvegardes hors de la machine

Une copie sur le même disque ne vous sauvera pas d'une erreur de migration, d'un rançongiciel ou d'une réinstallation de l'OS dans l'onglet « Accès ». Envoyez les dumps hors site :

rsync -az --delete /srv/backups/ backup@other-host:/store/vds/

Ou vers n'importe quel stockage compatible S3 via rclone. Gardez à l'esprit la bande passante allant jusqu'à 500 Mbit/s et la limite d'écriture disque par palier : 60 Mo/s par cœur.

Vérification de la restauration

Une sauvegarde que vous n'avez jamais restaurée n'est pas une sauvegarde.

createdb -U postgres shop_check
pg_restore -U postgres -d shop_check /srv/backups/shop-2026-08-23.dump
psql -U postgres -d shop_check -c "SELECT count(*) FROM users;"
dropdb -U postgres shop_check

Pour MySQL : gunzip -c dump.sql.gz | mysql -u root shop_check.

Faites-le une fois par mois et notez la date de vérification.

Erreurs courantes

SymptômeCause
Le dump ne fait que quelques kilo-octetsLe script a échoué à l'authentification et l'erreur est allée dans /dev/null
L'espace disque est épuiséAucune suppression des anciennes sauvegardes par mtime
La restauration échoue sur les permissionsLes rôles n'ont pas été dumpés — il faut --roles-only
Cron est silencieux, aucune sauvegardeCron n'a pas votre PATH — utilisez des chemins absolus
Le site ralentit la nuitLe dump entre en concurrence pour le disque — décalez l'heure, ajoutez --quick

Conservez au moins deux copies à des emplacements différents et surveillez la taille du dump : une chute brutale de la taille signifie que la base de données n'a pas été dumpée en entier.