172 votes

Réduire la taille des fichiers de la base de données MongoDB

J'ai une base de données MongoDB qui était autrefois volumineuse (>3 Go). Depuis lors, des documents ont été supprimés et je m'attendais à ce que la taille des fichiers de la base de données diminue en conséquence.

Mais comme MongoDB conserve l'espace alloué, les fichiers sont toujours volumineux.

J'ai lu ici et là que la commande d'administration mongod --repair est utilisé pour libérer l'espace inutilisé, mais je n'ai pas assez d'espace sur le disque pour exécuter cette commande.

Connaissez-vous un moyen de libérer l'espace inutilisé ?

150voto

Gates VP Points 26481

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.

  1. 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.
  2. 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).

40voto

awaage Points 914

Il semble que Mongo v1.9+ a un support pour le compact en place !

> db.runCommand( { compact : 'mycollectionname' } )

Voir les docs ici : http://www.mongodb.org/display/DOCS/compact+Commande

"Contrairement à repairDatabase, la commande compact ne nécessite pas de double espace disque pour effectuer son travail. Elle nécessite toutefois une petite quantité d'espace supplémentaire pendant son fonctionnement. En outre, compact est plus rapide."

39voto

user435943 Points 320

J'ai eu le même problème, et je l'ai résolu en faisant simplement ceci à la ligne de commande :

mongodump -d databasename
echo 'db.dropDatabase()' | mongo databasename
mongorestore dump/databasename

25voto

OzzyCzech Points 1509

Compacter toutes les collections dans la base de données actuelle

db.getCollectionNames().forEach(function (collectionName) {
    print('Compacting: ' + collectionName);
    db.runCommand({ compact: collectionName });
});

13voto

David James Points 8344

Si vous devez effectuer une réparation complète, utilisez la fonction repairpath option. Dirigez-le vers un disque ayant plus d'espace disponible.

Par exemple, sur mon Mac, j'ai utilisé :

mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair

Mise à jour : Per Ticket 4266 pour le serveur MongoDB Core vous devrez peut-être ajouter --nojournal pour éviter une erreur :

mongod --config /usr/local/etc/mongod.conf --repair --repairpath /Volumes/X/mongo_repair --nojournal

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X