磁盤空間優化
MongoDB 不會釋放已經占用的硬盤空間。即使刪除 db 中的集合 ,MongoDB 也不會釋放磁盤空間。同樣,如果使用 GridFS 存儲文件,從 GridFS 存儲中刪除無用的垃圾文件,MongoDB 依然不會釋放磁盤空間的。這會造成磁盤一直在消耗,而無法回收利用的問題。
那怎樣才能釋放磁盤空間呢?
1.可以通過修復數據庫來回收磁盤空間,即在 mongo shell 中運行 db.repairDatabase()命令(已經不可用)或者 db.runCommand({repairDatabase: 1 }) 命令(此命令執行比較慢)。
使用通過修復數據庫方法回收磁盤時需要注意,待修復磁盤的剩余空間必須大於等於存儲數據集占用空間加上 2G,否則無法完成修復。因此使用 GridFS 大量存儲文件必須提前考慮設計磁盤回收方案,以解決MongoDB 磁盤回收問題。
2.使用 dump & restore 方式,即先刪除 MongoDB 數據庫中需要清除的數據,然后使用 mongodump 備份數據庫。備份完成后,刪除 MongoDB 的數據庫,使用 Mongorestore 工具恢復備份數據到數據庫。
當使用 db.repairDatabase()命令沒有足夠的磁盤剩余空間時,可以采用 dump & restore 方式回收磁盤資源。如果 MongoDB 是副本集模式,dump & restore 方式可以做到對外持續服務,在不影響 MongoDB正常使用下回收磁盤資源。
MongoDB 使用副本集, 實踐使用 dump & restore 方式,回收磁盤資源。70G 的數據在 2 小時之內完成數據清理及磁盤回收,並且整個過程不影響 MongoDB 對外服務,同時可以保證處理過程中數據庫增量數據的完整。