Skip to content

磁盘被日志占满 ​

问题现象 ​

服务无法写入、数据库报 No space left on device,磁盘使用率 100%,删除日志后可用空间仍没有增加。

适用环境 ​

Linux、Docker json-file 或应用文件日志;需要管理员诊断权限。

本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。

复现或诊断步骤 ​

  1. 用 df -hT 与 df -i 区分块空间和 inode 耗尽。
  2. 对明确目录运行 du -xhd1,逐层定位;避免无范围扫描大型网络挂载。
  3. 用 lsof +L1 检查已经删除但仍被进程打开的文件,检查 Docker 日志驱动与日志路径。

原因分析 ​

没有轮转的日志持续增长;删除仍打开的文件只移除目录项,空间要等进程关闭描述符才释放。大量小文件可能先耗尽 inode,df 与 du 也会因挂载、权限和已删文件而不同。

修复示例 ​

json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "5"
  }
}

示例是 Docker daemon 配置片段,必须合并现有配置,不能整文件覆盖。先将必要诊断日志备份到其他磁盘,再按明确文件清理或通过应用轮转;不要直接删除 Docker 管理的日志文件。daemon 默认设置通常只影响新建容器,现有容器需安排重建。重启前保存配置并评估服务影响,失败恢复配置与容器。

验证方法 ​

确认 df 可用空间和 inode 恢复,应用继续写入,日志轮转实际触发。核对备份可读和保留周期,再删除确认可丢弃的备份;不得顺带删除数据库目录或 Docker volumes。

常见误区 ​

docker system prune -a --volumes 不是日志修复命令,可能删除业务数据。truncate 同样丢失内容,只能在明确授权、指定日志且完成必要留存后考虑。

官方参考链接 ​

相关分类:部署与运维 · 全部笔记