菜鸟摸石头过河,使用mongodb有几个月,数据一直在不断累加,现在mongodb已经200G,我试图删除一些数据,但是mongodb并没有释放那些空间。
查资料显示需要使用 db.repairDatabase(),但是出现了一个错误:
"Cannot repair database db_wallpaper having size: 212447789056 (bytes) because free disk space is: 157012410368 (bytes)"。
硬盘空间不足以空出200G... 该怎么办...
mongo: 2.6.3
迷茫2017-04-17 14:01:06
比較慢的方法:可以嘗試為這個資料庫增加一個replica-set,等新加的結點和老數據同步了之後就可以停掉老數據庫並刪除老數據,以新結點對外提供服務,此時資料庫空間應該已經整理好並壓縮到最小了。這個過程本身並不可控,200 GB 的話要同步多久無法預估,但是不會太影響 mongodb 繼續提供服務。
比較快的方法:用 mongodump/mongoexport 匯出所有數據,可以遠端匯出,倒完之後再用 mongorestore/mongoimport 恢復資料。這個操作會導致 mongodb 鎖定資料庫,無法對外提供服務,如果鎖了也無所謂可以用這個方法,200 GB 說不定需要小半天的時間,得自己估量一下。
另外,db.repairDatabase()
效果很有限,且會導致長時間鎖定資料庫,不用為好。 mongodb 解決磁碟問題比較好的方法是用 auto-sharding 將資料分攤到多台機器上,不過這個事情得提前規劃好,一旦資料庫已經非常大了,能做的事情就很少了。
PHP中文网2017-04-17 14:01:06
官方文件上有說明:
repairDatabase requires free disk space equal to the size of your current data set plus 2 gigabytes. If the volume that holds dbpath lacks sufficrepient When mounting a separate volume for repairDatabase you must run repairDatabase from the command line and use the --repairpath switch to specify the folder in which to store temporary repair files.
如果目前磁碟分割空間不足,可以嘗試用 --repairpath
參數指定一個空間足夠的分割路徑
天蓬老师2017-04-17 14:01:06
親測解決方案:
匯出前, 刪除mongo裡面不需要的資料表和內容, 再執行以下操作.
使用Linux 下shell指令:
mongodump -o /xxx/xxx
我導出全部資料庫, 原本資料庫佔空間越200G, 匯出後為48G, 耗時3天左右
進入mongodb 資料庫檔案目錄, 預設為/var/lib/mongodb/, 可在/etc/mongod.conf 查看你的目錄位址, 刪除整個資料夾, 再新建該資料夾, 注意修改資料夾權限為mongodb使用者. (chown指令)
再使用mongostore, 恢復後佔空間90G左右, 耗時16小時
mongorestore -d database_name /xxx/xxx
以上操作皆在遠端伺服器完成.
另, 非常感謝@huandu的建議!!