警告
千万不要再执行命令的时候随意中断或者重启机器否则文件会损坏,如果条件允许必须做好备份
前言
首先介绍一下背景,我们有个项目用了mongo存储文件,是滚动删除一年的,结果越用越大越用越大,明明文件已经被删除了却还是磁盘不足了。
深入研究了一下GridFs中其实就两个集合
一个是fs.files保存的是文件的上传记录信息
一个是fs.chunks文件块儿
清理文件
首先我们先删除文件的上传记录信息,这里删除了180天前的文件上传信息
db.getCollection("fs.files").remove({ "uploadDate": { $lt: new Date(new Date().getTime() - 180 * 24 * 60 * 60 * 1000) } })
然后删除已经没有文件上传信息的文件块儿
db.fs.chunks.remove({ files_id: {$nin: db.fs.files.distinct("_id") } })
这样虽然删除了文件但是并没有释放空间
压缩空间并重建索引
如果没有mongo客户端
首先进入mongo bin目录
执行mongo -u账号 -p密码
use 库名
执行压缩数据库
Compact 动作最终由存储引擎 WiredTiger 完成,WiredTiger 在执行 compact 时,会不断将集合文件后面的数据往前面空闲的空间写,然后逐步 truancate 文件回收物理空间。每一轮 compact 前,WT 都会先检查是否符合 comapact 条件。
db.fs.chunks.remove({ files_id: {$nin: db.fs.files.distinct("_id") } })
db.runCommand({compact:"fs.chunks"})
db.runCommand({compact:"fs.files"})
重建索引
db.runCommand({reIndex:"fs.files"})
db.runCommand({reIndex:"fs.chunks"})