Pourquoi après avoir supprimé une collection de plus de 110 Go, mon répertoire / var / lib / mongodb a toujours la même taille?

12

J'ai des problèmes avec MongoDB et l'utilisation de l'espace. En particulier, j'avais une fois une grande collection d'environ 600 millions d'enregistrements totalisant 110+ Go sur le disque. Récemment, j'ai décidé de le supprimer car les données étaient obsolètes, pour ce faire, j'ai supprimé la collection via l'interface Web de rockmongo. En conséquence, rockmongo ne me montre plus la collection, mais mon utilisation du disque n'a pas changé du tout.

Y a-t-il une opération propre dont je ne suis pas au courant, qui doit être exécutée afin de synchroniser la base de données avec les fichiers de base de données sur le disque?

J'ai essayé d'effectuer une "réparation" mais le système se plaint qu'il n'y a pas assez d'espace sur le disque ... c'est parce qu'il est tout utilisé par MongoDB.

tunnuz
la source

Réponses:

19

Comme avec la plupart des systèmes de base de données, les fichiers de base de données ne rétrécissent pas lorsque vous supprimez des données, les données sont simplement supprimées / marquées comme supprimées et l'espace est réutilisé.

Vous aurez besoin de courir db.repairDatabase()vers un espace compact comme indiqué ici

non
la source
2
L'espace sur le disque dur était trop faible pour cela. Cependant , je résolu de cette façon: mongodump, oldDatabase.dropDatabase(), mongorestore --db newDatabase dump/oldDatabase.
tunnuz
4

Bien que l'approche mongodump / drop / mongorestore ci-dessus fonctionne correctement d'un point de vue technique, elle vous obligera à mettre la base de données hors ligne pendant que vous le faites, ce qui serait un événement affectant le service.

Si vous souhaitez le faire sans temps d'arrêt ET si vous utilisez des jeux de répliques MongoDB [1], vous pouvez le faire comme ceci:

  1. Sélectionnez un membre et arrêtez la MongoDB (service mongodb stop). S'il s'agissait du PRIMAIRE, attendez qu'un autre membre soit élu PRIMAIRE.
  2. Supprimez les fichiers de données de ce membre (cd / var / lib / mongodb; rm *).
  3. Redémarrez à nouveau le service MongoDB (service mongodb start).
  4. Attendez que le membre se resynchronise avec le PRIMARY (rs.status ()).
  5. Cela reconstruira uniquement les fichiers de données requis (plus petits).

Répétez ensuite les étapes ci-dessus pour chacun des autres membres du jeu de réplicas.

[1] https://docs.mongodb.org/manual/tutorial/deploy-replica-set )

James Mernin
la source