UPDATE : à partir de la v1.9+, il y a une compact
commandement.
Cette commande effectuera un compactage "en ligne". Il faudra toujours un peu d'espace supplémentaire, mais pas autant.
MongoDB compresse les fichiers par :
- copier les fichiers vers un nouvel emplacement
- parcourir en boucle les documents et les réordonner / les résoudre à nouveau
- remplacer les fichiers originaux par les nouveaux fichiers
Vous pouvez effectuer cette "compression" en exécutant mongod --repair
ou en se connectant directement et en exécutant db.repairDatabase()
.
Dans les deux cas, vous avez besoin d'espace quelque part pour copier les fichiers. Maintenant, je ne sais pas pourquoi vous n'avez pas assez d'espace pour effectuer une compression, cependant, vous avez quelques options si vous avez un autre ordinateur avec plus d'espace.
- Exporter la base de données vers un autre ordinateur sur lequel Mongo est installé (à l'aide de
mongoexport
) et vous pouvez ensuite importer cette même base de données (en utilisant la fonction mongoimport
). Vous obtiendrez ainsi une nouvelle base de données plus comprimée. Vous pouvez maintenant arrêter l'opération originale mongod
remplacez-les par les nouveaux fichiers de la base de données et vous êtes prêt à partir.
- Arrêtez le mongod actuel, copiez les fichiers de la base de données sur un ordinateur plus grand et exécutez la réparation sur cet ordinateur. Vous pouvez ensuite déplacer les nouveaux fichiers de la base de données vers l'ordinateur d'origine.
Il n'existe pas actuellement de bonne façon de "compacter sur place" en utilisant Mongo. Et Mongo peut définitivement prendre beaucoup d'espace.
La meilleure stratégie actuellement pour le compactage est d'utiliser une configuration maître-esclave. Vous pouvez ensuite compacter l'esclave, le laisser rattraper son retard et le faire basculer. Je sais que c'est encore un peu difficile. Peut-être que l'équipe Mongo proposera un meilleur compactage en place, mais je ne pense pas que ce soit une priorité pour eux. L'espace disque est actuellement supposé être bon marché (et il l'est généralement).