天天看點

MongoDB 删除資料後不釋放空間?

​​MongoDB​​ 3.6以後,預設使用的儲存引擎是 WiredTiger。這個引擎有一個特點,就是删除資料不釋放空間。例如現在你的一個集合裡面有10000000條資料,占用10GB 的硬碟空間。你把其中的9999999條資料都删了,占用空間仍然是10GB。

如果你想釋放空間,最直接的方法是删除整個集合(Drop Collection)或者删除整個資料庫(Drop Database)。

如果你的 MongoDB 版本小于4.4,但是大于等于3.6,那麼雖然删除了資料,磁盤空間不會釋放,但當你插入新的資料時,MongoDB 會重用之前占有的空間,而不會繼續額外占用新的磁盤空間。

例如你的集合有10GB,你删除了9999999條資料,接下來,在你新插入的資料總大小超過10GB 前,MongoDB 都不會申請額外的硬碟空間。

我們可以在 Robo 3T 上,通過檢視集合的統計資訊找到目前集合可重複使用的空間大小。在集合上右鍵,選擇​

​Statistics​

​​,從傳回的統計資料中,展開​

​wiredTiger​

​​-​

​block-manager​

​​-​

​file bytes available for reuse​

​。這裡顯示的資料就是目前集合可重用的空間大小。如下圖所示。

MongoDB 删除資料後不釋放空間?

如果你的 MongoDB 允許暫停讀寫操作,那麼還可以在 Robo 3T 或者 Mongo Shell 中使用​

​compact​

​指令來釋放空間。指令格式為:

db.runCommand({'compact': '集合名'})      

在 MongoDB 4.4之前的版本,​

​compact​

​會阻塞整個庫的增删改查操作,是以需要暫停外部讀寫後才能執行。

在 MongoDB 4.4 或以後的版本,​

​compact​

​指令幾乎可以在除了删除集合、增删索引外的任何時候執行。

參考資料