PostgreSQL 数据库磁盘空间占用排查手顺

1. 问题背景

在 PostgreSQL 数据库运维中,经常会遇到磁盘空间不足的告警。通过 du 命令可以快速定位到占用空间较大的数据目录,但需要进一步分析具体是哪个数据库、哪些表占用了大量空间,并制定清理方案。

2. 快速定位大容量数据库

2.1 查看数据目录空间占用

首先,登录到 PostgreSQL 服务器,查看数据目录下各数据库的占用情况:

bash 复制代码
# 查看 PostgreSQL 数据目录下各子目录大小(按大小降序排序)
[root@sysm-rh96j-4 bin]# du -sh /var/lib/pgsql/16/data/base/* | sort -rh
23G     /var/lib/pgsql/16/data/base/20989
12G     /var/lib/pgsql/16/data/base/31130
15M     /var/lib/pgsql/16/data/base/20543
13M     /var/lib/pgsql/16/data/base/16385
9.7M    /var/lib/pgsql/16/data/base/21570
8.1M    /var/lib/pgsql/16/data/base/21573
8.1M    /var/lib/pgsql/16/data/base/18499
8.0M    /var/lib/pgsql/16/data/base/18506
7.8M    /var/lib/pgsql/16/data/base/30929
7.7M    /var/lib/pgsql/16/data/base/18470
7.6M    /var/lib/pgsql/16/data/base/18921
7.5M    /var/lib/pgsql/16/data/base/1
7.4M    /var/lib/pgsql/16/data/base/5
7.4M    /var/lib/pgsql/16/data/base/4
0       /var/lib/pgsql/16/data/base/pgsql_tmp

结果分析:

  • 20989 目录占用 23G(最大)
  • 31130 目录占用 12G(次之)
  • 其他目录占用均小于 15M

2.2 确认数据库名称

这些数字目录对应的是数据库的 OID(对象标识符),需要连接到 PostgreSQL 查询对应的数据库名称:

sql 复制代码
-- 使用 postgres 用户登录 PostgreSQL
[root@sysm-rh96j-4 bin]# sudo -u postgres psql
ユーザー postgres のパスワード:
psql (16.8)
"help"でヘルプを表示します。

-- 查询大容量目录对应的数据库
postgres=# SELECT oid, datname FROM pg_database WHERE oid IN (20989, 31130);
  oid  |     datname
-------+------------------
 20989 | dat1
 31130 | dat2
(2 行)

确认结果:

  • OID 20989 → 数据库 dat1(占用 23G)
  • OID 31130 → 数据库 dat2(占用 12G)

3. 分析具体表空间占用

3.1 分析 dat1 数据库

连接到 dat1 数据库,查看表空间占用:

sql 复制代码
-- 切换到 dat1 数据库
postgres=# \c dat1
-- 查看表大小(按大小降序)
dat1=# SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) as total_size,
    pg_size_pretty(pg_relation_size(schemaname || '.' || tablename)) as table_size,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename) - pg_relation_size(schemaname || '.' || tablename)) as index_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC
LIMIT 10;

3.2 分析dat2数据库

sql 复制代码
-- 切换到 dat2 数据库
postgres=# \c dat2
-- 查看表大小(按大小降序)
dat2=# SELECT 
    schemaname,
    tablename,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) as total_size,
    pg_size_pretty(pg_relation_size(schemaname || '.' || tablename)) as table_size,
    pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename) - pg_relation_size(schemaname || '.' || tablename)) as index_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC
LIMIT 10;

4. 根本原因分析

根据排查,发现主要空间占用什么表,从而做后期清理处理

相关推荐
小白勇闯网安圈5 小时前
Django 模板复用、ORM 查询与多对多关系
数据库·python·django
TELL5215 小时前
帮我生成对应的sql 以及数据库-deepseek提示词
数据库·sql
能年玲奈喝榴莲牛奶5 小时前
系统规划与管理师-第一章-考点记忆
大数据·数据库·软考·系统规划与管理师·系规
SatanII6 小时前
mariadb
数据库·mariadb
大千UI工场6 小时前
时序数据库对数字孪生的作用
数据库·ui·时序数据库·前端开发·b端管理系统
Tongzhi20266 小时前
通芝科技无感考勤一体机:软硬一体,开箱即用
数据结构·数据库·科技·算法·均值算法·数据库开发
这就是佬们吗7 小时前
向量数据库选型与实战:从原理到生产环境的完整指南
数据库
Shawn Dev7 小时前
MySQL Binlog 数据误删除恢复完全指南
数据库·mysql·elasticsearch
oradh7 小时前
Oracle ADRCI 诊断数据工具总结
数据库·oracle·adrci
zzzll11117 小时前
Loop Engineering:循环工程的原理、实践与应用
java·数据库·python