Ubuntu环境下MongoDB磁盘空间管理指南
监控是磁盘空间管理的基础,通过工具实时掌握磁盘使用情况及数据库内部存储状态:
df -h
命令查看Ubuntu服务器各分区(尤其是MongoDB数据目录所在分区,如/var/lib/mongodb
)的磁盘使用率,快速定位空间不足的分区;du -sh /var/lib/mongodb/*
可深入查看MongoDB目录下各子目录(如数据文件、日志文件)的大小占比。db.stats()
:查看当前数据库的总数据大小(dataSize
)、索引大小(indexSize
)、存储占用(storageSize
)等关键指标;db.collection.stats()
(替换为具体集合名):分析单个集合的数据量、碎片率(freeStorageSize
与storageSize
的差值占比),识别占用空间大的集合。清理无用数据是缓解空间压力的直接手段,需根据数据类型选择合适方法:
db.collection.drop()
命令(如db.old_logs.drop()
),该操作会彻底移除集合及关联索引,立即释放对应的磁盘文件;db.collection.deleteMany({条件})
(如db.users.deleteMany({lastLogin: {$lt: ISODate("2024-01-01")}})
),删除指定条件的文档(如3个月未登录的用户数据)。mongod.log
)会持续增长,定期清理或归档旧日志(如使用logrotate
工具,配置按天分割日志并保留7天),避免占用过多空间。db.repairDatabase()
命令修复,回收损坏或无用的存储空间。需注意:修复前需停止MongoDB服务,并确保有足够的磁盘空间(建议预留1.5倍当前数据库大小)。删除数据后,MongoDB不会立即将空间返还给操作系统,需通过碎片整理释放空闲空间:
db.runCommand({compact: "collectionName"})
(如db.runCommand({compact: "orders"})
),整理集合数据文件的碎片,将空闲空间合并。需注意:
compact
命令仅阻塞写操作(如insert
、update
),不影响读操作;mongodump
导出数据库:mongodump --db your_database --out /path/to/backup
;use your_database; db.dropDatabase()
;mongorestore
恢复数据:mongorestore --db your_database /path/to/backup/your_database
。恢复后的数据库文件会重新组织,彻底释放未使用的空间。通过优化数据存储策略,降低数据库对磁盘空间的需求:
username
、order_id
),避免过度索引(每个索引都会占用存储空间,且影响写入性能)。mongod.conf
配置文件中设置:storage:
wiredTiger:
engineConfig:
cacheSizeGB: 4 # 根据服务器内存调整缓存大小
journalCompressor: snappy # 日志压缩(可选:snappy/zstd)
collectionConfig:
blockCompressor: snappy # 数据块压缩(可选:snappy/zlib/zstd,zstd压缩率更高但CPU消耗大)
重启MongoDB服务使配置生效。压缩会降低CPU使用率但增加少量CPU开销,需根据业务需求权衡。db.sessions.createIndex({expireAt: 1}, {expireAfterSeconds: 0})
(expireAt
字段需存储为Date类型)。TTL索引会定期后台清理过期数据,减少手动维护成本。若上述方法无法满足长期存储需求,需扩展磁盘容量:
vgextend
);lvextend -l +100%FREE /dev/mongodbVG/mongodbLV
);resize2fs /dev/mongodbVG/mongodbLV
,适用于ext4文件系统)。扩容后,MongoDB会自动识别新增空间。/var/lib/mongodb
):
mkfs.ext4 /dev/sdb1
);mkdir /mnt/newdata
);mount /dev/sdb1 /mnt/newdata
);mongod.conf
)中的dbpath
为/mnt/newdata
,重启服务。若需保留原有数据,可将原数据目录复制到新磁盘后再修改dbpath
。user_id
、order_date
)划分数据,提升查询性能的同时,解决单节点磁盘空间不足问题。