详解清除MongoDB所占用的多余的磁盘空间的方法
首先一点就是mongodb不会释放已经占用的硬盘空间,即使dropcollection也不行,除非dropdatabase。如果一个db曾经有大量的数据一段时间后又删除的话,硬盘空间就是一个问题,如何收回被mongdodb占用的多余空间?方法有两种
1.dump&restore
mongodump-ddatabasename-o/path/to/dump_dir echo'db.dropDatabase()'|mongo<databasename> mongorestore-d<databasename>/path/to/dump_dir
如果数据量不大,dump不需要太长时间的情况下,或者经常备份有dump文件的情况下,这种方法很简单。
2.repairdatabase
即在mongoshell中运行
db.repairDatabase()
,或者
db.runCommand({repairDatabase:1})
,第二种方法可以带其他几个参数
{repairDatabase:1, preserveClonedFilesOnFailure:<boolean>, backupOriginalFiles:<boolean>}
repairDatabase是官方文档中认为唯一可以回收硬盘空间的方法。
repairDatabaseistheappropriateandtheonlywaytoreclaimdiskspace.
当你有多个shard的且数据量巨大时,dump&restore方法会花费巨大的时间,这时第二种方法的优势就很明显,就是分别在每个shard上运行repairDatabase,结果会快很多。
PS:格式化mongoshell的输出
如果数据量大的情况下,mongoshell默认的输出很乱,几乎没法阅读。我们可以用.pretty()来解决这样的问题:
db.collection.find().pretty()
这样的输出会漂亮很多,每个field一行,
{ "_id":ObjectId("5396cd3823e97923ba689ef3"), "batch":66, "category":4, "cover_imgs":[ "/post_imgs/5396cd3823e97923ba689ef3/c_2.jpg", "/post_imgs/5396cd3823e97923ba689ef3/c_3.jpg", "/post_imgs/5396cd3823e97923ba689ef3/c_4.jpg" ], "created_at":ISODate("2014-06-10T09:18:06.383Z"), "fav_count":0, "host_reply_count":338, "last_reply_date":"2014-06-1721:22:00", "post_date":"2014-06-0619:57:00", "referer":"http://tieba.baidu.com/f?kw=%B9%C5%D7%B0%B5%E7%CA%D3%BE%E7", "reply_count":716, "reuse_type":2, "section":"古装电视剧", "seq":27180, "serial":false, "sort_index":0.997, "source_site":"贴吧", "updated_at":ISODate("2014-06-18T09:04:55.228Z"), "visible":true } { "_id":ObjectId("5396c7ca23e97921fb7de8e4"), "batch":74, "category":4, }
配置使其成为Default:
添加如下配置到$HOME/.mongorc.js,如果不存在则创建。
DBQuery.prototype._prettyShell=true
这样就不需要每次使用pretty()方法了,直接db.collection.find()即可。