1. 事故背景与紧急响应
那天凌晨3点17分,监控系统突然发出刺耳的警报声。我负责维护的电商平台数据库服务器磁盘使用率达到98%,而且还在持续上升。这个承载着日均300万订单的PostgreSQL集群一旦崩溃,将直接影响全国8个仓库的出货系统。
第一反应是查看监控面板:/var分区在15分钟内从75%飙升至临界值,而正常情况下这个分区的日增长量不会超过2%。更棘手的是,这是我们的主从架构中的主库节点,任何不当操作都可能导致数据不一致。
关键决策点:在磁盘完全写满前,我们有大约12分钟的操作窗口。必须优先保证数据库可写,同时避免触发OOM Killer终止Postgres主进程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题定位与临时处理
2.1 快速定位罪魁祸首
通过组合命令快速定位大文件:
bash复制# 按文件大小排序
find /var -type f -exec du -Sh {} + | sort -rh | head -n 15
# 检查PostgreSQL日志增长情况
du -sh /var/lib/pgsql/12/data/pg_log/
发现是PostgreSQL的WAL日志(pg_wal目录)暴增到120GB,正常情况下应该保持在20GB以内。进一步检查发现归档进程卡死,导致WAL日志无法正常轮转。
2.2 紧急释放空间方案
执行顺序至关重要:
-
立即清理系统日志(释放5-8GB):
bash复制journalctl --vacuum-size=200M rm -f /var/log/postgresql/*.old -
临时压缩旧日志(获得10GB空间):
bash复制find /var/log -name "*.log" -mtime +7 -exec gzip {} \; -
手动触发WAL归档(风险操作):
sql复制SELECT pg_switch_wal(); -- PostgreSQL 10+
3. 根因分析与修复
3.1 归档失败的深层原因
检查归档脚本发现三个关键问题:
- 备份存储挂载点使用NFS,网络抖动导致写入超时
- 归档脚本没有重试机制,失败后直接退出
3
