關於mongodb刪除集合后磁盤空間不釋放的問題


mongodb刪除集合后磁盤空間不釋放,只有用db.repairDatabase()去修復才能釋放。 

但是在修復的過程中如果出現了非正常的mongodb的掛掉,再次啟動時啟動不了的,需要先修復才可以, 
可以利用./mongod --repair --dbpath=/data/mongo/ 如果你是把數據庫單獨的放在一個文件夾中指定dbpath時就指 
向要修復的數據庫就可以,修復可能要花費很長的時間,在使用db.repairDatabase()去修復時一定要停掉讀寫,並且 
mongodb要有備機才可以,不然千萬不要隨便使用db.repairDatabase()來修復數據庫,切記。 

 

mognodb 在刪除數據的情況下不釋放占用的磁盤空間,即使drop collection也不行,除非drop database。
即,mongodb占用內存為10G時,刪除8G數據后,數據文件占用空間大小仍是10G。"df"命令查看內存占用沒有變化。
 
平時可以通過mongo命令行來監控MongoDB的內存使用情況,如下所示:
mongo> db.serverStatus().mem
{
"resident" : 22346,
"virtual" : 1938524,
"mapped" : 962283
}還可以通過mongostat命令來監控MongoDB的內存使用情況,如下所示:
shell> mongostat
mapped vsize res faults
940g 1893g 21.9g 0
其中內存相關字段的含義是:
mapped:映射到內存的數據大小
visze:占用的虛擬內存大小
res:占用的物理內存大小
注:如果操作不能在內存中完成,結果faults列的數值不會是0,視大小可能有性能問題。
在上面的結果中,vsize是mapped的兩倍,而mapped等於數據文件的大小,所以說vsize是數據文件的兩倍,
之所以會這樣,是因為本例中,MongoDB開啟了journal,需要在內存里多映射一次數據文件,如果關閉journal,
則vsize和mapped大致相當。
 
1.驗證刪除數據后用db.serverStatus().mem命令查看的內存占用是否變化:
查看mongo內存占用:
 
查看系統內存占用:
 
使用腳本向mongo插入大量數據。
 
 
刪除插入的數據后:
 
結論:刪除collection內的數據不會釋放磁盤空間;
 
可以采用db.runCommand({closeAllDatabases:1}):
利用dbshell指令查看內存占用顯示已釋放;
linux shell查看內存還沒釋放
 
進入刪除了數據的db,采用db.repairDatabase():
 
磁盤內存已經釋放。
 
repairDatabase是官方文檔中認為唯一可以回收硬盤空間的方法。
repairDatabase is the appropriate and the only way to reclaim disk space.
 
雖然可以用 db.repairDatabase()修復數據。但這種方法有兩個不好的地方。1.在生產上操作如果意外停止可能會造成數據無法恢復的危險。2.如果磁盤空間不足,小於現在這個db時間占有的空間,這種情況是用不了 db.repairDatabase()的。
 
注意,repairDatabase操作所需要磁盤的空余空間為當前數據總量再加上2G。如果當前磁盤分區空間不足,可以嘗試用 –repairpath 參數指定一個空間足夠的分區路徑。
 
試驗在內存占用超過50%的情況下能否使用db.repairDatabase()命令釋放占用的內存空間:
1.釋放內存小於當前剩余內存的情況:
 
刪除數據后:
 
執行db.repairDatabase()
 
結論:釋放的內存小於當前剩余內存,釋放成功。
2.釋放的內存大於當前內存的情況:
 
刪除數據后:
 
執行db.repairDatabase()
 
無法釋放內存
 
 
另:
python操作mongo釋放空間:
利用管道的方式將 db.repairDatabase() 命令寫入mongo.
 
 
 
 
 
 
 
 
 

--------------------- 本文來自 四月的水 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/weixin_40238625/article/details/78992432?utm_source=copy 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM