Postgres数据目录磁盘空间突发飙升后回落的原因排查求助
Postgres数据目录磁盘使用率突发飙升的排查方案
1. 优先检查Postgres日志
- 定位Postgres日志目录(默认在数据目录下的
pg_log),筛选磁盘飙升时段的日志,重点查找以下关键字:temp file:查看是否有大尺寸临时文件被创建(比如LOG: temporary file: path "base/pgsql_tmp/pgsql_tmp12345", size 10737418240),这类临时文件是大查询(排序、聚合、多表连接)的中间存储,执行完成后会自动删除,是磁盘突发占用的常见原因。VACUUM FULL、CLUSTER、REINDEX:这些操作会重写整个表或索引,生成与原对象大小相当的临时文件,操作完成后替换原文件并清理临时数据,会导致磁盘短时间飙升。
2. 临时文件配置与残留检查
- 执行Postgres命令
SHOW temp_file_limit;,确认是否对临时文件大小做了限制:若返回-1则无限制,大查询可能生成远超预期的临时文件。 - 检查数据目录下的
pgsql_tmp子目录:虽然临时文件会自动删除,但如果Postgres进程异常崩溃,可能残留未清理的临时文件,可通过ls -lh pgsql_tmp/查看是否有大文件残留。
3. 排查定时维护与长时查询
- 核对系统定时任务(如
cron),确认磁盘飙升时段是否有自动维护任务执行:比如自动VACUUM FULL、批量索引重建等操作。 - 若有历史
pg_stat_activity记录留存,检查该时段是否有长时间运行的大查询:这类查询通常涉及全表扫描、大结果集排序或多表关联,会持续占用临时磁盘空间直到执行结束。
4. 系统层面排查
- 查看系统日志(如
/var/log/syslog或/var/log/messages),检查磁盘飙升时段是否有以下操作:- 文件系统快照生成(部分快照工具会临时占用磁盘空间)
- 第三方工具误写入数据目录(比如备份脚本、监控进程错误输出到数据目录路径)
- 若能复现问题,在磁盘占用高峰时执行
du -sh <数据目录>/*,快速定位是哪个子目录(如base/、pgsql_tmp/)占用了大量空间,缩小排查范围。
5. 其他小众场景排查
- 检查分区表操作:若有批量删除分区后未立即执行
DROP TABLE,或对分区表执行大规模UPDATE,可能触发临时的磁盘占用。 - 排查大对象(
pg_largeobject):确认是否有大对象被创建后未及时清理,不过大对象删除后通常会被VACUUM自动回收,较少出现突发占用。
内容的提问来源于stack exchange,提问作者Juvette M
相关产品推荐
相关产品推荐

