zoukankan      html  css  js  c++  java
  • 关于mongodb删除集合后磁盘空间不释放的问题

    mongodb删除集合后磁盘空间不释放,只有用db.repairDatabase()去修复才能释放。 

    但是在修复的过程中如果出现了非正常的mongodb的挂掉,再次启动时启动不了的,需要先修复才可以, 
    可以利用./mongod --repair --dbpath=/data/mongo/ 如果你是把数据库单独的放在一个文件夹中指定dbpath时就指 
    向要修复的数据库就可以,修复可能要花费很长的时间,在使用db.repairDatabase()去修复时一定要停掉读写,并且 
    mongodb要有备机才可以,不然千万不要随便使用db.repairDatabase()来修复数据库,切记。 

    mognodb 在删除数据的情况下不释放占用的磁盘空间,即使drop collection也不行,除非drop database。
    即,mongodb占用内存为10G时,删除8G数据后,数据文件占用空间大小仍是10G。"df"命令查看内存占用没有变化。
     
    平时可以通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
    mongo> db.serverStatus().mem
    {
    "resident" : 22346,
    "virtual" : 1938524,
    "mapped" : 962283
    }还可以通过mongostat命令来监控MongoDB的内存使用情况,如下所示:
    shell> mongostat
    mapped vsize res faults
    940g 1893g 21.9g 0
    其中内存相关字段的含义是:
    mapped:映射到内存的数据大小
    visze:占用的虚拟内存大小
    res:占用的物理内存大小
    注:如果操作不能在内存中完成,结果faults列的数值不会是0,视大小可能有性能问题。
    在上面的结果中,vsize是mapped的两倍,而mapped等于数据文件的大小,所以说vsize是数据文件的两倍,
    之所以会这样,是因为本例中,MongoDB开启了journal,需要在内存里多映射一次数据文件,如果关闭journal,
    则vsize和mapped大致相当。
     
    1.验证删除数据后用db.serverStatus().mem命令查看的内存占用是否变化:
    查看mongo内存占用:
     
    查看系统内存占用:
     
    使用脚本向mongo插入大量数据。
     
     
    删除插入的数据后:
     
    结论:删除collection内的数据不会释放磁盘空间;
     
    可以采用db.runCommand({closeAllDatabases:1}):
    利用dbshell指令查看内存占用显示已释放;
    linux shell查看内存还没释放
     
    进入删除了数据的db,采用db.repairDatabase():
     
    磁盘内存已经释放。
     
    repairDatabase是官方文档中认为唯一可以回收硬盘空间的方法。
    repairDatabase is the appropriate and the only way to reclaim disk space.
     
    虽然可以用 db.repairDatabase()修复数据。但这种方法有两个不好的地方。1.在生产上操作如果意外停止可能会造成数据无法恢复的危险。2.如果磁盘空间不足,小于现在这个db时间占有的空间,这种情况是用不了 db.repairDatabase()的。
     
    注意,repairDatabase操作所需要磁盘的空余空间为当前数据总量再加上2G。如果当前磁盘分区空间不足,可以尝试用 –repairpath 参数指定一个空间足够的分区路径。
     
    试验在内存占用超过50%的情况下能否使用db.repairDatabase()命令释放占用的内存空间:
    1.释放内存小于当前剩余内存的情况:
     
    删除数据后:
     
    执行db.repairDatabase()
     
    结论:释放的内存小于当前剩余内存,释放成功。
    2.释放的内存大于当前内存的情况:
     
    删除数据后:
     
    执行db.repairDatabase()
     
    无法释放内存
     
     
    另:
    python操作mongo释放空间:
    利用管道的方式将 db.repairDatabase() 命令写入mongo.
     
     
     
     
     
     
     
     
     

    --------------------- 本文来自 四月的水 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_40238625/article/details/78992432?utm_source=copy 

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/panchanggui/p/9704949.html
Copyright © 2011-2022 走看看