使用版本為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 }
沒錯,WT使用最新版本的話
compact
确实可以回收空间,但是因为某个bug这应该是在3.2的某个版本之后生效的,我不记得具体版本号(3.2.9?),但是可以肯定3.2.1肯定无效,而升级到最新版本3.2.12肯定能解决这个问题。相对于
repairDatabase
来说,compact
看起來確實要輕量級一些,但是不能迴避的問題是,它仍然是一個很重的操作。設想一下windows的磁碟碎片整理,原理是一樣的。更建議的,影響更小的做法是使用複製集滾動重新初始化所有結點,空間即可釋放。更重要的問題是,回收這些空間對你是否真的有意義?大部分時候系統佔用這些空間就意味著它有可能再次佔用這些空間(除非系統設計上有變動)。與其釋放掉到時候再重新分配一次,不如保持在那系統也會重複利用。
下面是我的理解:
1、對單一collection的compact,不會回收檔案系統的儲存空間;整個資料庫db.repairDatabase() ,才能回收檔案系統的儲存空間。請嘗試使用repirDatabase()。
2、另外也可以使用匯出/匯入collection的方式
上述操作留心對系統性能的影響。供參考。
這幾天休假了,也提前祝春節假期快樂。
Love MongoDB! Have Fun!