検索

ホームページ  >  に質問  >  本文

mongodb如何回收文档“缩水”后应该腾出的空间?

使用版本为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 }
漂亮男人漂亮男人2757日前574

全員に返信(2)返信します

  • ringa_lee

    ringa_lee2017-05-02 09:26:24

    確かにWTは最新バージョンを使うと軽くなったように見えますが、やはり動作が重いのは避けられない問題です。 Windows でのディスクのデフラグを想像してみてください。原理は同じです。より推奨される、影響の少ないアプローチは、レプリカ セットを使用してすべてのノードをローリング的に再初期化し、スペースを解放することです。 compact确实可以回收空间,但是因为某个bug这应该是在3.2的某个版本之后生效的,我不记得具体版本号(3.2.9?),但是可以肯定3.2.1肯定无效,而升级到最新版本3.2.12肯定能解决这个问题。
    相对于repairDatabase来说,compact

    より重要な質問は、このスペースを取り戻すことが実際にあなたにとって意味があるかということです。ほとんどの場合、システムがこれらのスペースを占有しているという事実は、(システム設計に変更がない限り) これらのスペースを再び占有する可能性が高いことを意味します。それを解放して後で再割り当てするのではなく、そこに保持しておくと、システムがそれを再利用します。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-02 09:26:24

    以下は私の理解です:

    1. 単一コレクションの圧縮ではファイル システムのストレージ スペースは再利用されません。データベース全体の db.repairDatabase() のみがファイル システムのストレージ スペースを再利用できます。 repirDatabase() を使用してみてください。

    2. エクスポート/インポート収集方法も使用できます

    上記の操作がシステムのパフォーマンスに与える影響に注意してください。参考までに。

    私は最近休暇中ですが、春節休暇が楽しく過ごせることを祈っています。

    MongoDB を愛してください!

    返事
    0
  • キャンセル返事