MongoDB磁盘空间回收

背景

MongoDB-2.x版本只有在dropDatabase的时候才会释放磁盘空间,drop collection并不会减少磁盘占用。如果需要回收磁盘空间,需要采取一些措施。

可用方案

一、 repairDatabase

repairDatabase是官方给出的唯一可以释放磁盘空间的方法。repairDatabase只能在master或者primary上执行,对于secondary只能以standalone的方式启动,然后执行repairDatabase。 repairDatabase对剩余可用磁盘空间有要求,必须大于等于原库的大小才能执行。

> db.repairDatabase()
{
        "errmsg" : "Cannot repair database test having size: 8919110281013 (bytes) because free disk space is: 349286095543 (bytes)",
        "ok" : 0
}

数据量大的话耗时会比较长,而且会阻塞所有操作,所以不能在线上提供服务的节点上直接执行。

二、 copyDatabase

为了绕过方案一对空间的要求,可以采用copyDatabase。因为copyDatabase只需要占用实际data set的空间,一般在删除collection后,剩余数据会比较小。由于copyDatabase支持远程拷贝,如果空间实在不足,可以使用一个临时的mongod中转。copyDatabase不会阻塞操作。大致步骤:

  • 删除不需要的collection
  • db.copyDatabase(‘databasename’, ‘databasename_tmp’)
  • use databasename; db.dropDatabase()
  • db.copyDatabase(‘databasename_tmp’, ‘databasename’)

三、 mongodump/mongorestore

解决思路与方案二相同。大致步骤:

  • 删除不需要的collection
  • mongodump –port 2018 -uread -pread -d databasename -o tmp
  • echo ‘db.dropDatabase()’ | mongo databasename
  • mongorestore –port 2018 -u’write’ -p’write’ -d databasename tmp/databasename/

四、 使用副本集的initial sync

需要重建所有库,耗时较长



评论(0条)

暂时还没有评论,第一个来评论吧!


我要发表看法

引用   粗体   链接   缩进  

最近编辑

热门标签