Debian系统下MongoDB磁盘空间管理指南
定期监控是磁盘空间管理的基础。通过df -h命令查看磁盘分区使用率(重点关注根分区/或MongoDB数据目录所在分区),判断是否需要清理。对于MongoDB内部空间,可使用db.getCollectionNames()获取所有集合名称,再通过db[collection].stats()查看各集合的数据大小(size)、存储大小(storageSize,包含预分配空间)和索引大小(indexSize),快速定位占用空间大的集合。
根据业务需求删除无用数据,释放空间:
db.collection.drop()命令删除不再需要的集合(如临时集合、测试数据集合),该操作会彻底移除集合及其中的所有文档和索引。db.collection.deleteMany({条件})命令删除符合条件的文档(如过期的日志记录、已完成的任务数据),支持批量删除以提高效率。db.dropDatabase()命令删除整个数据库(如废弃的业务数据库),需谨慎操作以避免误删。MongoDB提供两种压缩方式,针对不同场景优化空间:
db.runCommand({compact: 'collectionName'})命令压缩指定集合,回收未使用的空间(如删除文档后的空隙)。注意:该操作会锁定集合(阻塞写入),建议在低峰期执行。/etc/mongod.conf启用压缩。在storage.wiredTiger.engineConfig下设置collectionConfig.blockCompressor为snappy(快速压缩,适合通用场景)或zlib(高压缩比,适合冷数据),例如:storage:
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整(建议为物理内存的1/4-1/2)
collectionConfig:
blockCompressor: snappy # 启用Snappy压缩
修改后重启MongoDB服务(sudo systemctl restart mongod)使配置生效。当数据库存在损坏数据或无效空间时,可使用db.repairDatabase()命令修复。该命令会扫描数据库文件,移除无效数据并重组存储结构,从而回收未使用的空间。注意:修复过程需停止写入操作(建议在维护窗口执行),且会消耗较多CPU和内存资源。
MongoDB的日志文件(默认路径/var/log/mongodb/mongod.log)会持续增长,需通过以下方式控制:
logrotate工具自动切割日志。编辑/etc/logrotate.d/mongod文件,添加以下配置(每天切割、保留7天、每个日志文件最大100MB):/var/log/mongodb/mongod.log {
daily
rotate 7
size 100M
compress
delaycompress
missingok
notifempty
create 640 mongodb mongodb
sharedscripts
postrotate
/bin/kill -SIGUSR1 $(cat /var/run/mongodb/mongod.pid 2>/dev/null) 2>/dev/null || true
endscript
}
保存后,logrotate会自动执行切割任务(可通过sudo logrotate -vf /etc/logrotate.d/mongod手动测试)。db.runCommand({logRotate: 1})命令手动触发日志切割,无需停止服务。合理的数据模型设计可从根源减少空间占用:
$lookup),减少索引数量。索引虽能提升查询性能,但过多或不合理的索引会增加存储负担:
db.collection.createIndex({field: 1})创建升序索引,db.collection.createIndex({field1: 1, field2: -1})创建复合索引),避免全表扫描。db.collection.aggregate([{ $indexStats: {} }])命令查看索引使用情况(accesses.ops表示索引使用次数),删除长期未使用的索引(如db.collection.dropIndex("indexName")),减少存储占用。/etc/mongod.conf中设置storage.wiredTiger.engineConfig.cacheSizeGB参数(如4表示使用4GB内存作为缓存),将常用数据放入内存,减少磁盘读取次数。