使用版本为mongodb-win32-x86_64-3.2.1,用的默认的WiredTiger存储引擎。
一个collection中有大约400万文档,占用40G空间;后来遍历删除每个文档处理中无用的部分并更新(未删除文档),执行此任务的脚本如期运行完成,根据其输出统计,文档整体缩减到原来45%左右,也就是有20G多些的空间被腾出来了,但数据库文件体积没有变小,反而增大了一点点(1%左右)。
看了文档中关于存储的章节,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 !