服务器磁盘满了怎么清理?空间、inode、日志与扩容顺序

2026-09-19

直接答案:服务器磁盘满了以后,先停止继续写满的非核心任务,确认是哪个挂载点、块空间还是 inode 耗尽,再找增长来源。日志、容器镜像、缓存、备份和数据库文件的处理方式完全不同;不要执行网上复制来的 rm -rf,不要手工删除 MySQL 数据文件或仍需恢复的 Binlog,也不要把“文件删了但空间没回来”误判为命令无效。

生产环境建议先保存 df、目录占用、最近增长文件、进程打开文件和服务日志,再做最小清理。若网站仍能写入,优先保护订单、数据库和上传目录;若磁盘已导致数据库只读或进程崩溃,先限制新增流量并准备恢复路径。

先判断四种“磁盘满”

类型 典型证据 根因方向 第一动作
块空间满 df -h 某挂载点接近 100% 日志、备份、数据、镜像 找同一挂载点的大目录和增长文件
inode 满 df -i 接近 100% 海量小缓存、会话、邮件或临时文件 按目录统计文件数量
已删文件未释放 du 之和明显小于 df 进程仍持有已删除文件句柄 用 lsof +L1 找持有进程
挂载异常 数据写入根分区而非数据盘 数据盘未挂载、路径改变 先恢复挂载,避免继续写错位置

df -hT 显示文件系统和挂载点,df -i 看 inode;du -x 的 -x 可避免跨到其他文件系统。不要从 / 直接执行无边界的全盘扫描而影响繁忙服务器,应从已确认的挂载点逐层缩小,并用 find 的时间、大小条件定位近期增长。

安全定位步骤

  1. 记录 date -Is、df -hT、df -i 和受影响服务。
  2. 在目标挂载点用 du -x --max-depth=1 找最大一级目录。
  3. 对最大目录继续下钻,并检查最近一小时或一天增长的文件。
  4. 用 lsof +L1 检查已删除但仍占空间的文件。
  5. 对照 Nginx、应用、数据库、systemd journal、备份和容器任务的时间线。

du 与 df 口径不同并不一定是损坏。除了已删除未释放文件,还可能受保留块、快照、稀疏文件和挂载覆盖影响。只有证据指向文件系统异常时,才安排离线检查;不要在已挂载且持续写入的数据盘上贸然运行修复工具。

不同来源怎样处理

Web 与应用日志

先确认日志仍有审计价值,再压缩旧文件或调整轮转。直接删除当前正在写的日志,进程可能继续持有句柄,空间不会释放;更安全的做法是按服务支持方式轮转并让进程重新打开日志。Nginx 支持发送 reopen 信号,配置改动前应先执行语法检查。

systemd journal

先用 journalctl --disk-usage 看占用,再按时间或容量做受控 vacuum。日志上限应写入配置并保留故障所需窗口,而不是每次满盘后手动清空。若刚发生入侵或宕机,应先导出相关时间段再压缩。

Docker 镜像、容器和卷

使用 docker system df 区分镜像、容器、构建缓存和卷。docker system prune 不应盲目加 --volumes;未挂载卷可能仍保存生产数据。先把每个卷映射到服务和备份,再清理明确无用的对象。

数据库文件和 Binlog

数据库目录、Redo/Undo、WAL、Binlog 必须通过数据库自身机制管理。手工删除可能让实例无法启动或破坏时间点恢复。先确认备份、复制关系和保留要求,再执行官方清理命令。数据库备份边界可参考MySQL 数据库备份和恢复。

数据库显示的逻辑数据量可能小于磁盘占用,因为索引、事务日志、临时表、表空间碎片和备份都有成本。应先由数据库查询各类文件用途,再决定归档、保留或重建;不要以资源管理器看到的“最大文件”作为删除依据。清理 Binlog 前尤其要核对从库、增量备份和时间点恢复所需位置。

上传、备份和临时文件

重复全量备份、失败任务留下的临时包、用户上传和离线导出常持续增长。先按文件时间和任务记录确认归属,再把需长期保存的数据迁到对象存储或独立备份介质。不要把唯一备份当“垃圾文件”删除。

inode 满了怎样找小文件

inode 用尽时,磁盘可能仍显示很多 GB 空闲,却无法创建新文件。常见来源是 PHP Session、缓存键文件、邮件队列、缩略图或程序错误循环产生的小日志。可以按目录统计文件数量,先找数量异常的一层,再确认应用的过期和清理机制。

删除海量文件也可能造成 IO 峰值,生产环境应分批进行并观察负载。若应用还在不断生成,先修复生成逻辑或暂停对应任务,否则清理速度可能赶不上增长速度。

什么时候应扩容而不是清理

如果数据增长来自有效业务,或者清理后不到一个正常周期就会再次接近阈值,应扩容或拆分。容量预算可按:

目标容量 = 当前有效数据 + 日增长量 × 规划天数 + 备份/临时峰值 + 文件系统与故障余量

扩容前确认云盘能否在线扩容、分区表、文件系统类型、是否需要停机和是否有快照。扩容完成后必须同时验证块设备、分区、文件系统和应用可写,不可只看控制台容量。若准备迁移,可参考网站迁移到云服务器流程。需要更大数据盘或弹性配置时,可查看美国弹性云服务器和美国轻量云的实时选项。

清理与扩容后的验收

验收至少包括:目标挂载点块空间和 inode 都恢复安全余量;数据库、Web、队列和上传可写;日志继续生成并能轮转;已删除未释放文件消失;备份任务成功且有恢复样本;增长速率已纳入监控。设置容量和增长率双告警,比固定“90%告警”更早发现异常。监控方法可结合云服务器监控告警指南。

常见问题

删除大文件后 df 为什么没下降?

常见原因是进程仍打开该文件。用 lsof +L1 找到持有者,并按服务方式重开日志或平滑重启;不要为了释放一个文件直接重启整机。

du 很小但 df 已满是什么原因?

可能是已删除未释放文件、挂载覆盖、保留块或快照等口径差异。先检查句柄和挂载关系,再判断是否需要文件系统维护。

可以删除 /var/log 下所有文件吗?

不可以。日志可能是故障、安全和合规证据,当前文件还可能被进程持有。应按服务轮转、压缩和保留策略处理。

Docker 卷显示未使用就能删吗?

不能只凭“未挂载”判断。停机容器的生产数据也可能在卷中。先映射卷、服务、备份和恢复路径。

磁盘扩容后为什么系统里容量没变?

云盘、分区和文件系统是不同层。控制台扩容只完成底层容量变化,还需按分区表和文件系统类型扩展上层,并在每一步验收。

官方参考资料

最近更新