MongoDB数据删除后的磁盘空间释放

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.

 

你可能感兴趣的:(数据库)