web-dev-qa-db-fra.com

MongoDB / WiredTiger: Réduit la taille du stockage après avoir supprimé les propriétés des documents

J'utilise Mongodb 3.4 avec le moteur de stockage WiredTiger sur une réplique de 4 nœuds.

J'ai réduit beaucoup de documents en supprimant les propriétés qui prend la majeure partie de l'espace, mais le Documentation dit que cette opération ne réduit pas la taille de stockage (seule la taille de données) et je peux confirmer c'est vrai.

J'ai donc essayé d'utiliser le compact Commande: Certains espaces ont été libérés mais la taille de stockage est toujours plus grande que la taille des données. Est-ce parce que cela ne bouge que des documents mais ne réduit pas l'espace déjà attribué par documents?

Dois-je supprimer et recréer tous les documents pour réduire réellement la taille de stockage?

2
clemp6r

Juste pour clarifier, veillez à utiliser repairDatabase sur un nœud de réplique. repairDatabase est destiné à être utilisé pour récupérer des données lisibles à I.e. Après une corruption de disque, elle peut donc supprimer des données illisibles et laisser MongoDB commencer à la corruption du disque.

Si ce nœud a une corruption non détectée de disque et que vous exécutez repairDatabase dessus, cela pourrait entraîner ce nœud particulier ayant un contenu de données différent contre l'autre nœud à la suite de repairDatabase. Puisque Mongodb suppose que tous les nœuds d'un ensemble de répliques contiennent des données identiques, cela pourrait entraîner des crashs et des problèmes difficiles à diagnostiquer . En raison de sa nature, cette question pourrait rester en sommeil pendant longtemps et se manifester soudainement avec une vengeance, apparemment sans raison apparente.

Wiredtiger éventuellement réutilisera les espaces vides avec de nouvelles données, et le point de contrôle périodique que WiredTiger ait pu potentiellement Space de libération au système d'exploitation sans aucune intervention de votre part.

Si vous avez vraiment besoin de récupérer de la place au système d'exploitation, une synchronisation initiale est le choix le plus sûr si vous avez un réplique. Sur une autonomie, Dump/Restaure obtiendra le même résultat. Sinon, compact est le choix plus sûr vs. repairDatabase. Veuillez sauvegarder vos données avant de les faire, car à mon avis, cela se qualifierait comme une maintenance majeure.

1
kevinadi

Si vous utilisez une réplique définie avec plus de 2 nœuds, vous pouvez démarrer la synchronisation initiale sur un secondaire à l'heure (et enfin votre primaire au secondaire pour la synchronisation initiale). En supprimant tous les fichiers de données des nœuds DBPATH.

Ou, si vous avez "assez" espace disque libre, vous pouvez utiliser répareAbase commande. Commande reconstituera à nouveau tous les fichiers de données.

Bien sûr, la troisième option est l'exportation (Dump) DB avec toutes ses collections sur le disque, déposez la base de données, puis importer tout en arrière.

La quatrième option serait (nécessite un espace supplémentaire) Base de données de copie sur le nouveau nom (nom temporaire), déposez l'ancienne base de données, reportez-vous à nouveau à nouveau au nom d'origine, puis déposez cette base de données temporaire. Ceci parce qu'il n'y a pas de commande "renameMedatabase" à MongoDB.

0
JJussi