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.
Sauvegarde avec mongodump
Section intitulée « Sauvegarde avec mongodump »mongodump --uri="mongodb://app@127.0.0.1:27017/boutique?authSource=boutique" --out=/var/backups/mongo/dumpmongodump --uri="mongodb://app@127.0.0.1:27017/boutique?authSource=boutique" --archive=boutique.gz --gzipmongodump --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.
Restaurer avec mongorestore
Section intitulée « Restaurer avec mongorestore »mongorestore --uri="mongodb://admin@127.0.0.1:27017/?authSource=admin" /var/backups/mongo/dumpmongorestore --uri="mongodb://admin@127.0.0.1:27017/?authSource=admin" --archive=boutique.gz --gzipmongorestore --drop --nsInclude="boutique.*" dump/ # remplace les collections existantesmongorestore --nsInclude="boutique.clients" --nsFrom="boutique.clients" --nsTo="boutique_test.clients" dump/ # vers une autre baseLa 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.
Vérifier la sauvegarde
Section intitulée « Vérifier la sauvegarde »ls -lh boutique.gzmongorestore --archive=boutique.gz --gzip --dryRun --nsInclude="boutique.*" --verbose 2>&1 | tail -5Le test définitif est la restauration complète dans une base d’essai :
mongorestore --archive=boutique.gz --gzip --nsFrom="boutique.*" --nsTo="verif.*"mongosh --quiet verif --eval 'db.clients.countDocuments()'Export et import de données : JSON et CSV
Section intitulée « Export et import de données : JSON et CSV »mongoexport et mongoimport échangent des données lisibles par d’autres outils (mais ne conservent pas tous les types BSON ni les index).
mongoexport --db=boutique --collection=clients --out=clients.json --jsonArraymongoexport --db=boutique --collection=clients --type=csv --fields=nom,email,ville --out=clients.csv
mongoimport --db=boutique --collection=clients_import --file=clients.json --jsonArraymongoimport --db=boutique --collection=clients_import --type=csv --headerline --file=clients.csvPour une sauvegarde complète, préférer mongodump (types et index conservés).
Planifier avec cron
Section intitulée « Planifier avec cron »Script /usr/local/bin/sauvegarde-mongo.sh, avec les identifiants dans un fichier de configuration lisible uniquement par son propriétaire :
sudo tee /etc/mongo-backup.conf <<'CONF'uri: mongodb://sauvegarde:<mot-de-passe>@127.0.0.1:27017/?authSource=adminCONFsudo chmod 600 /etc/mongo-backup.conf#!/usr/bin/env bashset -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 joursfind "$DEST" -name "mongo-*.gz" -mtime +14 -deletesudo chmod 750 /usr/local/bin/sauvegarde-mongo.shsudo crontab -e30 2 * * * /usr/local/bin/sauvegarde-mongo.sh >> /var/log/sauvegarde-mongo.log 2>&1Créer l’utilisateur sauvegarde avec le rôle backup (voir Utilisateurs et droits). Copier ensuite les sauvegardes hors du serveur.
Instantané du disque
Section intitulée « Instantané du disque »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();Dépannage
Section intitulée « Dépannage »| 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 |
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel : Backup Methods et mongodump
- Planification : Bonnes pratiques Bash