首先一点就是mongodb 不会释放已经占用的硬盘空间,即使drop collection也不行,除非drop database。如果一个db曾经有大量的数据一段时间后又删除的话,硬盘空间就是一个问题,如何收回被mongdodb占用的多余空间?方法有两种
1. dump & restore
mongodump -d databasename -o /path/to/dump_dir echo \'db.dropDatabase()\' | mongo <databasename> mongorestore -d <databasename> /path/to/dump_dir
如果数据量不大,dump不需要太长时间的情况下,或者经常备份有dump文件的情况下,这种方法很简单。
2. repair database
即在mongo shell中运行
db.repairDatabase()
, 或者
db.runCommand({ repairDatabase: 1 })
, 第二种方法可以带其他几个参数
{ repairDatabase: 1, preserveClonedFilesOnFailure: <boolean>, backupOriginalFiles: <boolean> }
repairDatabase是官方文档中认为唯一可以回收硬盘空间的方法。
repairDatabase is the appropriate and the only way to reclaim disk space.
当你有多个shard的且数据量巨大时,dump & restore方法会花费巨大的时间,这时第二种方法的优势就很明显,就是分别在每个shard上运行repairDatabase,结果会快很多。
PS:格式化mongo shell的输出
如果数据量大的情况下,mongo shell 默认的输出很乱,几乎没法阅读。我们可以用.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-17 21:22:00\", \"post_date\" : \"2014-06-06 19: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()即可。
本文地址:https://www.stayed.cn/item/13719
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我