使用版本为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 }
ringa_lee2017-05-02 09:26:24
確かにWTは最新バージョンを使うと軽くなったように見えますが、やはり動作が重いのは避けられない問題です。 Windows でのディスクのデフラグを想像してみてください。原理は同じです。より推奨される、影響の少ないアプローチは、レプリカ セットを使用してすべてのノードをローリング的に再初期化し、スペースを解放することです。 compact
确实可以回收空间,但是因为某个bug这应该是在3.2的某个版本之后生效的,我不记得具体版本号(3.2.9?),但是可以肯定3.2.1肯定无效,而升级到最新版本3.2.12肯定能解决这个问题。
相对于repairDatabase
来说,compact
伊谢尔伦2017-05-02 09:26:24
以下は私の理解です:
1. 単一コレクションの圧縮ではファイル システムのストレージ スペースは再利用されません。データベース全体の db.repairDatabase() のみがファイル システムのストレージ スペースを再利用できます。 repirDatabase() を使用してみてください。
2. エクスポート/インポート収集方法も使用できます
上記の操作がシステムのパフォーマンスに与える影響に注意してください。参考までに。
私は最近休暇中ですが、春節休暇が楽しく過ごせることを祈っています。
MongoDB を愛してください!