La version utilisée est mongodb-win32-x86_64-3.2.1, et le moteur de stockage WiredTiger par défaut est utilisé.
Il y a environ 4 millions de documents dans une collection, occupant 40 Go d'espace ; plus tard, la partie inutile de chaque traitement de document a été parcourue et mise à jour (le document n'a pas été supprimé). . Selon ses statistiques de sortie, le document La réduction globale a été réduite à environ 45 % de l'original, ce qui signifie que plus de 20 Go d'espace ont été libérés. Cependant, la taille du fichier de base de données n'a pas diminué, mais a augmenté. un peu (environ 1%).
Lisez le chapitre sur le stockage dans le document, https://docs.mongodb.com/v3.2...,其中提到删除文档导致的空记录占用空间可通过compact回收(使用WiredTiger存储引擎时),没提到前述这种修改文档形成的“虚占空间”的情形,我运行了compact,几秒钟就结束了,存储文件没有变小。那么该怎么办呢?
> use cache
switched to db cache
> db.htmldocs.runCommand("compact")
{ "ok" : 1 }
> db.runCommand({compact: "htmldocs"})
{ "ok" : 1 }
Oui, si WT utilise la dernière version
compact
il peut effectivement récupérer de l'espace, mais à cause d'un bug cela devrait prendre effet après une certaine version de 3.2. Je ne me souviens plus du numéro de version spécifique (3.2.9 ? ). Mais il est certain que la version 3.2.1 n'est définitivement pas valide, et la mise à niveau vers la dernière version 3.2.12 résoudra définitivement ce problème.Comparé à
repairDatabase
,compact
semble être plus léger, mais le problème inévitable est qu'il s'agit toujours d'une opération lourde. Imaginez la défragmentation de disque sous Windows, le principe est le même. Une approche plus recommandée et moins efficace consiste à utiliser un jeu de réplicas pour réinitialiser progressivement tous les nœuds, et l'espace peut être libéré.La question la plus importante est la suivante : la reconquête de cet espace a-t-elle réellement un sens pour vous ? La plupart du temps, le fait que le système ait occupé ces espaces signifie qu’il est susceptible d’occuper à nouveau ces espaces (à moins que la conception du système ne change). Au lieu de le libérer et de le réaffecter plus tard, il est préférable de le conserver et le système le réutilisera.
Ce qui suit est ma compréhension :
1. Le compactage d'une seule collection ne récupérera pas l'espace de stockage du système de fichiers ; seul db.repairDatabase() de la base de données entière peut récupérer l'espace de stockage du système de fichiers. Veuillez essayer d'utiliser repirDatabase().
2. Vous pouvez également utiliser la méthode de collecte export/import
Soyez conscient de l'impact des opérations ci-dessus sur les performances du système. Pour référence.
Je suis en vacances ces jours-ci et je vous souhaite par avance de joyeuses vacances de la Fête du Printemps.
J'adore MongoDB ! Amusez-vous !