先用df -h确认磁盘使用率,重点检查/var/lib/mongodb;再进mongo shell执行db.serverStatus().storageEngine.wiredTiger和db.stats()分析缓存、日志及碎片情况;最后根据是否支持热扩选择在线扩容或迁移数据目录。

磁盘满了不能直接删数据或硬重启,得先判断是“临时撑爆”还是“结构性满”,再选迁移或在线扩容——后者更安全,但必须确认底层存储支持热扩展。
如何快速确认是不是真满了、满在哪
别急着操作,先用 df -h 看挂载点使用率,重点盯 /var/lib/mongodb(或你配置的 storage.dbPath);再进 mongo shell 执行:db.serverStatus().storageEngine.wiredTiger,检查 cache.used 和 log.fileSize 是否异常高;最后查 db.stats() 里的 dataSize vs storageSize,如果后者远大于前者,说明碎片多,compact 可能救急,但仅限空闲空间 >110% 集合物理大小时才有效。
云硬盘在线扩容后,文件系统没识别新增空间
常见于阿里云/腾讯云/AWS 的 EBS/ECS 云盘扩容后,df -h 仍显示旧容量。这是因为分区和文件系统没同步扩展:
- 先确认是否用了 LVM:运行
lsblk或pvs,有输出说明是 LVM,走pvresize → lvextend → resize2fs(ext4)或xfs_growfs(xfs) - 没 LVM 但用的是标准分区:执行
growpart /dev/vda 1(注意设备名和分区号),再根据文件系统类型执行resize2fs /dev/vda1或xfs_growfs /mnt/data - 扩容完务必验证:
df -h显示新容量 +sudo systemctl restart mongod后观察日志无ENOSPC报错
不能在线扩容?那就迁移数据目录到大磁盘
适用于物理机、旧云盘不支持热扩、或 SELinux/AppArmor 权限卡死的情况:
- 停 mongod:
sudo systemctl stop mongod,确保无残留进程 - 复制数据目录(保留权限):
sudo rsync -avh --progress /var/lib/mongodb/ /data/bigdisk/mongodb/ - 修改
/etc/mongod.conf中的storage.dbPath指向新路径,同时检查systemLog.path和wiredTiger.engineConfig.logPath是否也要挪走(尤其 Config Server) - 修复权限:
sudo chown -R mongodb:mongodb /data/bigdisk/mongodb(用户组名以实际为准) - 启动前先手动测试:
sudo -u mongodb mongod --config /etc/mongod.conf --dryRun,无报错再systemctl start mongod
副本集里只有一台节点磁盘满,其他正常,能单独处理吗
可以,但必须避开主节点写入高峰,并防止触发全量同步(initial sync)把新盘又打爆:
- 优先在从节点操作:
rs.status()确认目标节点stateStr是SECONDARY,再停服迁移或扩容 - 如果是主节点且无法切主,先执行
rs.stepDown()让它降级,等新主选举完成再操作 - 迁移后首次启动,WiredTiger 会做 recovery,观察日志中是否有
recovery timestamp和finished startup,避免误判为卡死 - 切记:不要在同步滞后大的节点上直接
compact,可能延长同步时间甚至中断 oplog 追赶
真正容易被忽略的是 WiredTiger 日志路径和 config.system.sessions ——它们常躲在 /data/configdb 或默认 dbPath 下,不显眼但涨得飞快;一次满盘事故,70% 出在没把这两处挪到独立挂载点。


















