当前位置: 首页 > news >正文

mongoDB 删除集合后,空间不释放

 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()即可。

转载于:https://www.cnblogs.com/gaoyuechen/p/10242851.html

相关文章:

  • mysql分页(ajax)
  • BZOJ 1565 植物大战僵尸(最大权闭合图)
  • UVa 1586 - Molar mass
  • 072:【Django数据库】ORM聚合函数详解-aggregate和annotate
  • 配置ssh的双机信任
  • hdfs远程连接异常
  • linux if 命令判断条件总结
  • 【M15】了解异常处理(exception handling)的成本
  • 【代码】模板实现双向链表的去重、拼接、合并、排序
  • Netflix Media Database - 架构设计和实现
  • 又拍云引领云CDN加速 或成互联网刚性需求
  • Genymotion常见问题整合与解决方案(转)
  • 用webmagic实现一个java爬虫小项目
  • 化工文件下载地址
  • 搭建K8S高可用集群(二进制方式)
  • hexo+github搭建个人博客
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • angular2开源库收集
  • ES2017异步函数现已正式可用
  • HTML中设置input等文本框为不可操作
  • JAVA SE 6 GC调优笔记
  • Java的Interrupt与线程中断
  • Js基础知识(一) - 变量
  • learning koa2.x
  • mysql_config not found
  • PAT A1120
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 好的网址,关于.net 4.0 ,vs 2010
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 详解NodeJs流之一
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  •  一套莫尔斯电报听写、翻译系统
  • 找一份好的前端工作,起点很重要
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​2021半年盘点,不想你错过的重磅新书
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Maven错误Error executing Maven
  • #define与typedef区别
  • #前后端分离# 头条发布系统
  • (06)金属布线——为半导体注入生命的连接
  • (145)光线追踪距离场柔和阴影
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (MATLAB)第五章-矩阵运算
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (蓝桥杯每日一题)love
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)Controller接口控制器详解(三)
  • (一)基于IDEA的JAVA基础10
  • (转)创业的注意事项
  • .gitignore文件---让git自动忽略指定文件
  • .htaccess 强制https 单独排除某个目录
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 8.0 发布到 IIS