mongoDB 删除集合后,空间不释放,添加新集合,没有重新利用之前删除集合所空出来的空间,也就是数据库大小只增不减。

方法有:

1、导出导入 dump & restore

2、修复数据库 repair database

3、复制数据库 db.copyDatabase(“from”,”to”,”127.0.0.1:27017”);

4、重新同步复制集

方法一:导出导入 dump & restore

所需时间根据数据库实际大小而定,如果数据量不大,dump不需要太长时间的情况下,或者经常备份有dump文件的情况下,这种方法很简单。

备份

#Mongodump –h IPAddress --port 27017 –d DatabaseName –u UserName –p Password –authenticationDatabase admin –o backup_dir

恢复

#Mongorestore –h IPAddress --port 27017 –d DatabaseName –u UserName –p Password –authenticationDatabase admin backup_dir

方法二:修复数据库 repair database

  需要停机,即便你不停机的话 mongodb 自己也会锁住直到 repair 完成。注意要有足够的磁盘空间,需要额外一倍的空间,如果mongodb 占用了100G,那么 repair 时还需要额外的100G+2G 空间。可以追加磁盘,然后将目标目录指向新加的磁盘。

我理解到官网的意思是,在确认修复过程不中断并且有足够的空闲空间的前提下,那么这个repair database方法是回收磁盘空间唯一合适的方法(注意前提啊)。

# mongod --dbpath /data/db --repair --repairpath /data/db0

如果当前磁盘足够的话可直接在 mongo 命令行中运行:

>  db.repairDatabase()

或者

> db.runCommand({ repairDatabase: 1 })

第二种方法可以带其他几个参数

{ repairDatabase: 1,

preserveClonedFilesOnFailure: <boolean>,

backupOriginalFiles: <boolean> }

只要磁盘空间够基本上没什么问题。

这种方法有两个不好的地方。1.在生产上操作如果意外停止可能会造成数据无法恢复的危险。2.如果磁盘空间不足,小于现在这个db时间占有的空间,这种情况是用不了    db.repairDatabase()的。

方法三:复制数据库 db.copydatabase

1.db.copyDatabase("from","to","127.0.0.1:27017");复制出一个新的to数据库。这个已经是最小数据占用的数据。会在数据目录下产生to的相关数据文件。127.0.0.1:27017是from的数据库所在的地址和端口号。

2.将所有程序的配置从from库改为to库。

3删除from库。

>use from

> db.dropDatabase()

这个方法的好处是可以时间将磁盘上的数据删除掉。节省出很大的空间。

方法四:重新同步复制集

  还没整理好,后续再补充。

MongoDB不会自动进行垃圾文件清理,不过我们可以借助自带的repairDatabase等功能来实现,下面我们就来详解清除MongoDB所占用的多余的磁盘空间的方法,附带一个如何格式化mongo shell的输出的小技巧:

首先一点就是mongodb 不会释放已经占用的硬盘空间,即使drop collection也不行,除非drop database。如果一个db曾经有大量的数据一段时间后又删除的话,硬盘空间就是一个问题,如何收回被mongdodb占用的多余空间?方法有两种
1. dump & restore

?

1

2

3

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中运行

?

1

db.repairDatabase()

, 或者

?

1

db.runCommand({ repairDatabase: 1 })

, 第二种方法可以带其他几个参数

?

1

2

3

{ 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() 来解决这样的问题:

?

1

db.collection.find().pretty()

这样的输出会漂亮很多,每个field一行,

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

{

 "_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, 如果不存在则创建。

?

1

DBQuery.prototype._prettyShell = true

这样就不需要每次使用pretty()方法了,直接db.collection.find()即可。

mongoDB 删除集合后,空间不释放的更多相关文章

  1. 关于mongodb删除集合后磁盘空间不释放的问题

    mongodb删除集合后磁盘空间不释放,只有用db.repairDatabase()去修复才能释放. 但是在修复的过程中如果出现了非正常的mongodb的挂掉,再次启动时启动不了的,需要先修复才可以, ...

  2. mongoDB 删除集合后,空间不释放的解决方法

    mongoDB 删除集合后,空间不释放,添加新集合,没有重新利用之前删除集合所空出来的空间,也就是数据库大小只增不减. 方法有: 1.导出导入 dump & restore 2.修复数据库 r ...

  3. Linux 删除文件后空间不释放【原创】

    删除MySQL备份文件后,查找文件所在目录发现文件已经备删除了,但是空间没有释放,还是83% 解决方法: lsof|grep -i delete 发现进程还在,杀掉进程 kill -9 5377 再次 ...

  4. 解决linux删除文件后空间没有释放问题

    linux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [ro ...

  5. linux 删除文件后空间没有释放的解决办法

    清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [root@ticketb ~]# df -hFilesystem          ...

  6. Linux 删除文件后空间不释放磁盘空间

    在Linux操作系统下,有个没用的文件占用了400G,于是删除掉. [root@yoon log]# rm -rf messages [root@yoon log]# df -hFilesystem ...

  7. Linux系统下rm删除文件后空间没有释放问题解决办法

    一.问题描述 今日收到zabbix监控报警,发现生产环境一台服务器的磁盘空间不足,需要进行处理,登录后发现可利用率不足20%,进行相关查看和处理工作:但是操作删除了一些备份文件和日志信息后,查看空间仍 ...

  8. Linux解决删除文件后空间没有释放问题_端口占用问题

    使用命令 (1) losf | grep deleted 查询所有已经删除但是还未释放空间的进程,找到容量最大的线程,kill -9 pid 然后等待容量释放 (2) netstat -ano | g ...

  9. Linux删除文件后空间不释放

    最近线上 elasticsearch 由于磁盘空间不足报错,于是乎对磁盘进行了分析,删除了一些 Tomcat 日志文件,但是删除后发现并没有磁盘空间释放.于是 google 了一下. 原来在Linux ...

随机推荐

  1. 订单状态 Mark

    ) { ) { ) { ) { ) { ) { ) { ) { ) { ) { ) { ) { ) { ) { ))) { ))) { ))) { ))) { )); } else { Assert. ...

  2. 安装CDH5时出错 5.68.168.192.in-addr.arpa domain name pointer bogon.

    这个是因为使用的DNS是联通的server,联通会将所有保留的网络地址RFC1918( http://tools.ietf.org/html/rfc1918)都指向"bogon" ...

  3. svm工具箱快速入手简易教程

    首先svm是用来做分类的,是一种有监督的分类器. 什么是有监督的呢?就是说在你给我一个数据集让我做分类之前.我已经有一些经验数据了.即要先进行学习,再进行分类. 这里就有了训练集和测试集.先用训练集来 ...

  4. Java使用Rabbitmq惊喜队列queue和消息内容的本地持久化核心方法。(内容存储在硬盘)

    _Channel.queueDeclare(queue, true, false, false, null); _Channel.basicPublish(_ExchangeName, queue,M ...

  5. CentOS中安装JAVA环境

    好消息, 程序员专用早餐机.和掌柜说 ideaam,可以节省20元. 点击链接   或復·制这段描述¥k3MbbVKccMU¥后到淘♂寳♀ 一般情况下,我们都要将linux自带的OPENJDK卸载掉, ...

  6. eclipse 运行 emulator时,PANIC:Could not open emulator 的解决办法

    使用eclipse启动emulator的时候,出现PANIC:Could not open emulator,模拟器无法正常的运行. 经过搜索得知,因为我的SDK的环境变量出问题,需要重新配置下环境变 ...

  7. js获取IP地址多种方法实例教程

    js获取IP地址方法总结   js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...

  8. Xilinx FPGA用户约束文件(转自xilinx ISE 开发指南

    FPGA设计中的约束文件有3类:用户设计文件(.UCF文件).网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束.管 脚约束以及区域约束.3类约束文件的关系为:用户在设计输 ...

  9. [svc]linux性能监控

    参考 w - Show who is logged on and what they are doing. [root@n1 ~]# w # w - Show who is logged on and ...

  10. 【Unity】7.1 Input类的方法和变量

    分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在Input类中,Key与物理按键对应,例如键盘.鼠标.摇杆上的按键,其映射关系无法改变,程序员可以通过按键名称或者按键 ...