dy-dashboard/vault/知识库/工作指南/训练记录/2026-09-21-云端磁盘满导致登录卡死修复.md
2026-10-28 11:14:17 +08:00

70 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2026-09-21 云端磁盘满导致登录卡死排查与修复
### 1. 排查云端系统无法打开并解决
**旭东 → OpenClaw:**
> 云端系统现在又异常了,无法打开,检查一下什么原因并解决
**OpenClaw 响应:**
已完成排查并修复,云端(gyl.dieya.net.cn)访问恢复正常。
**现象与时间线**
- 09:27 报障时外网探针:静态首页可返回 200,但 `POST /api/login` 会卡住不返回,即页面能打开、点登录没反应。
- 08:30 每日备份 cron 执行,导出 698M 数据库 SQL 后打包时磁盘写满,日志出现 `gzip: stdout: No space left on device`,`tar` 只写入 2048/10240 字节后失败,本次备份**中断失败**。
- 因为脚本是 `set -euo pipefail` 且中断在第 2 步,末尾的 `rm -f ${DB_DUMP}` 没执行到,那 698M 临时 SQL 文件滞留在项目目录,磁盘继续维持 100%。
- 09:05 gunicorn 出现 `Autorestarting worker after current request`,09:07 报 `WORKER TIMEOUT (pid:968880)`,中断栈正好停在 `POST /api/login` → `services/db.py` 的 `conn.commit()`,即 **MySQL 因磁盘满无法提交写入,登录请求被拖到 60 秒超时**。
- 排查时服务已部分自愈(gunicorn 自动重启,登录接口 0.4 秒返回 401),但磁盘仍是 100%、可用 0,随时会再挂。
**根因**
- 磁盘 100% 满:40G 用了 38G,可用 0(2 核 2G 的云端小机)。
- 占空间主要是历次累积的备份:`/opt/dy-dashboard-backups` 12G、`/opt/dy-dashboard_backups` 4.5G、`/opt/dy-dashboard/backups` 3.4G、`/home/ubuntu/dy-dashboard-backups` 3.9G、`/opt/backups` 0.65G、`/home/ubuntu/backups` 0.71G,合计约 25G。
- 现有自动保留策略只覆盖每日备份目录里的 `dy_platform_backup_*`(30 天),`new_products_images_*` 与各次手工/部署备份目录都没有清理机制。
- 本次不是代码或数据库问题:MySQL、nginx 日志均无报错,恢复写入后登录、备份全部正常。
**处理(清理范围先经旭东确认,选「清理 9/10 之前的旧备份 + 失败残留」)**
- 删除各备份目录中 2026-09-10 之前的备份(`/opt/dy-dashboard-backups`、`/opt/dy-dashboard_backups`、`/opt/backups`、`/home/ubuntu/backups`、`/home/ubuntu/dy-dashboard-backups`、`/opt/dy-dashboard/backups`),保留 09-10 以后全部备份。
- 删除失败残留:698M 临时 SQL `dy_data_20260921_0830.sql`、截断损坏的 `dy_platform_backup_20260921_0830.tar.gz`(仅 85M,不可用)。
- 未动范围外内容:`/opt/dy-dashboard.old-20260808_101255`(278M)、`/opt/dy-dashboard-before-20260807_092207`(254M)保留;两份 full-cloud 全量备份(09-20、09-21)保留。
**结果与验证**
- 磁盘:38G 已用 / 0 可用(100%)→ **23G 已用 / 16G 可用(59%)**,释放约 15G。
- 服务:`dy-dashboard.service` active(gunicorn 主进程未重启过);本机 127.0.0.1:18888 → 200(0.004s);公网首页 200(0.34s)、登录接口 200(0.68s)。
- 补做备份:重跑 `backup.sh` 成功,生成 `dy_platform_backup_20260921_0930.tar.gz`(177M)+ `new_products_images_20260921_0930.tar.gz`(59M),临时 SQL 由脚本正常清理,磁盘保持 60%。
**后续建议(待旭东决定,未擅自改)**
- 给手工/部署备份目录加保留策略(例如只留最近 7~14 天),并让 `backup.sh` 的清理覆盖 `new_products_images_*`,否则磁盘还会再次被慢慢填满。
- `backup.sh` 建议做失败兜底:tar 失败时也要把临时 SQL 删掉(当前 `set -e` 会让 698M 文件残留),并可考虑磁盘水位预检。
### 2. 磁盘占用治理建议与每日备份保留策略
**旭东 → OpenClaw:**
> 查一下现在云服务里面的40g用了多少了?
>
> 关于这个磁盘状态占用情况,有没有什么好的建议处理方法?
**OpenClaw 响应:**
**现状**:40G 用 23G、可用 16G(59%)。占用分布:`/opt/dy-dashboard-backups` 7.0G(两份 full-cloud)、`/var/lib/mysql` 3.0G、`/opt/dy-dashboard` 2.8G、`/var/log` 580M、`/opt/dy-dashboard_backups` 245M。
**定位到真正的"水龙头"**:自动化任务「云端每日完整备份」(每天 08:00 跑 `backup_cloud_daily.py`)每天向 `/opt/dy-dashboard-backups` 写一份 3.5G 全量包,**没有任何保留策略**;今天 08:00 那次吃掉最后约 4G(manifest 记录创建时 `disk_free=785M`),08:30 每日备份就写不进去了。按此节奏每日增量约 3.7G,20G 可用只够约 5 天。该全量包 3.4G 中水分极大:脚本 `tar -czf ... -C /opt dy-dashboard` 无任何排除项,把 venv、uploads、vault、logs 连同 `/opt/dy-dashboard/backups` 里的每日备份包又打了一遍包(套娃)。
**给出的建议**:① 全量备份瘦身(排除 venv/backups/logs 等,3.4G→约 250M)+ 只留最近 2 份 + 降为每周一次;② 每日备份目录加保留策略;③ `backup.sh` 加失败兜底(trap 删临时 SQL)与磁盘水位预检;④ 全量包定期外移到 11.79 或对象存储,云端只留最近 1 份;⑤ journald 设 `SystemMaxUse=200M`、MySQL 加 `binlog_expire_logs_seconds`、`inventory_detail`(1.1G)历史明细归档;⑥ 加磁盘水位告警(>80% 主动通知)。
**旭东选定执行**:仅第 ② 项「每日备份目录加保留策略」。
**已执行(云端生产)**:
- 先备份原脚本到 `~/dy-backups/backup-sh-pre-retention-20260921_094541/backup.sh`。
- 修改 `/opt/dy-dashboard/backup.sh` 第 4 步清理段:`dy_platform_backup_*.tar.gz` 保留期 30 天 → **14 天**;新增 `new_products_images_*.tar.gz` **保留 7 天**(此前该文件从未被清理,每天约 59M)。`bash -n` 语法检查通过。
- 立刻按新策略清理一次:图片包删除 09-10/09-11/09-12/09-13 共 4 份(约 230M),09-14 起 7 份保留;项目包无超过 14 天的,未删除。
- 目录由 2.8G 降到 2.5G,文件数 21;磁盘 59%(23G 用 / 16G 可用)不变(本次释放量在四舍五入内);服务 active、本机 200。
- 未执行其余各项:全量备份瘦身/保留/降频、backup.sh 失败兜底、备份外移、系统层优化、磁盘告警,均等旭东后续指令。