• 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
  • 相关阅读:
    DShow实现一个avi视频的播放(含有个人解释和注释)
    指针和引用的区别
    从头看算法导论 习题2.3-7 深入分析
    程序员福利各大平台免费接口,非常适用
    NYOJ 58 最少步数
    NYOJ 42 一笔画问题
    NYOJ 1058 部分和问题
    NYOJ 21 三个水杯
    winform里面网页显示指定内容
    C#中List<T>对象的深度拷贝问题
  • 原文地址:https://www.cnblogs.com/seasonzone/p/15138244.html
Copyright © 2020-2023  润新知