Aller au contenu

MongoDB : sauvegarde et restauration

Une sauvegarde n’a de valeur que testée : restaurer régulièrement sur une machine d’essai. Les outils (mongodump, mongorestore, mongoexport, mongoimport) font partie du paquet mongodb-database-tools, installé avec mongodb-org (voir Installation). Les exemples utilisent la base boutique.

Fenêtre de terminal
mongodump --uri="mongodb://app@127.0.0.1:27017/boutique?authSource=boutique" --out=/var/backups/mongo/dump
mongodump --uri="mongodb://app@127.0.0.1:27017/boutique?authSource=boutique" --archive=boutique.gz --gzip
mongodump --db=boutique --collection=clients --out=dump_clients # une collection (sans authentification)
mongodump -u admin --authenticationDatabase admin --out=dump_tout # toutes les bases
Option Rôle
--out=dossier Un dossier avec un fichier BSON par collection
--archive=fichier --gzip Un seul fichier compressé
--db, --collection Limite à une base ou une collection
--query='{"statut":"payee"}' Sauvegarde les documents filtrés (avec --collection)
--oplog Sauvegarde cohérente à un instant précis (jeu de réplicas uniquement)

Le mot de passe est demandé de façon interactive quand il n’est pas fourni dans l’URI.

Fenêtre de terminal
mongorestore --uri="mongodb://admin@127.0.0.1:27017/?authSource=admin" /var/backups/mongo/dump
mongorestore --uri="mongodb://admin@127.0.0.1:27017/?authSource=admin" --archive=boutique.gz --gzip
mongorestore --drop --nsInclude="boutique.*" dump/ # remplace les collections existantes
mongorestore --nsInclude="boutique.clients" --nsFrom="boutique.clients" --nsTo="boutique_test.clients" dump/ # vers une autre base

La restauration ne recrée pas les utilisateurs d’une base d’application sauf si --db admin et les collections système sont sauvegardées : sauvegarder aussi la base admin si nécessaire.

Fenêtre de terminal
ls -lh boutique.gz
mongorestore --archive=boutique.gz --gzip --dryRun --nsInclude="boutique.*" --verbose 2>&1 | tail -5

Le test définitif est la restauration complète dans une base d’essai :

Fenêtre de terminal
mongorestore --archive=boutique.gz --gzip --nsFrom="boutique.*" --nsTo="verif.*"
mongosh --quiet verif --eval 'db.clients.countDocuments()'

mongoexport et mongoimport échangent des données lisibles par d’autres outils (mais ne conservent pas tous les types BSON ni les index).

Fenêtre de terminal
mongoexport --db=boutique --collection=clients --out=clients.json --jsonArray
mongoexport --db=boutique --collection=clients --type=csv --fields=nom,email,ville --out=clients.csv
mongoimport --db=boutique --collection=clients_import --file=clients.json --jsonArray
mongoimport --db=boutique --collection=clients_import --type=csv --headerline --file=clients.csv

Pour une sauvegarde complète, préférer mongodump (types et index conservés).

Script /usr/local/bin/sauvegarde-mongo.sh, avec les identifiants dans un fichier de configuration lisible uniquement par son propriétaire :

Fenêtre de terminal
sudo tee /etc/mongo-backup.conf <<'CONF'
uri: mongodb://sauvegarde:<mot-de-passe>@127.0.0.1:27017/?authSource=admin
CONF
sudo chmod 600 /etc/mongo-backup.conf
#!/usr/bin/env bash
set -euo pipefail
DEST="/var/backups/mongo"
mkdir -p "$DEST"
mongodump --config=/etc/mongo-backup.conf --archive="$DEST/mongo-$(date +%F_%H%M).gz" --gzip
# Conserve 14 jours
find "$DEST" -name "mongo-*.gz" -mtime +14 -delete
Fenêtre de terminal
sudo chmod 750 /usr/local/bin/sauvegarde-mongo.sh
sudo crontab -e
30 2 * * * /usr/local/bin/sauvegarde-mongo.sh >> /var/log/sauvegarde-mongo.log 2>&1

Créer l’utilisateur sauvegarde avec le rôle backup (voir Utilisateurs et droits). Copier ensuite les sauvegardes hors du serveur.

Pour de grandes bases, un instantané (LVM, ZFS, disque du fournisseur) est plus rapide. Pour garantir la cohérence, verrouiller temporairement les écritures :

db.fsyncLock(); // vide les écritures sur disque et bloque les nouvelles
// … instantané du volume contenant /var/lib/mongodb …
db.fsyncUnlock();
Symptôme Piste
command not found: mongodump Installer mongodb-database-tools (ou le métapaquet mongodb-org)
Authentication failed Ajouter authSource=admin (ou la base où l’utilisateur a été créé)
not authorized on admin L’utilisateur a besoin du rôle backup (sauvegarde) ou restore (restauration)
--oplog refusé Cette option exige un jeu de réplicas
Restauration très lente --numParallelCollections, --numInsertionWorkersPerCollection, ou instantané du disque