PostgreSQL pg_tablespace_size() 函数使用指南

PostgreSQL pg_tablespace_size() 是一个关键的实例级存储空间监控函数。在企业级 PostgreSQL 架构中,DBA 通常会通过表空间(Tablespaces)将不同重要程度或访问频率的数据分布在不同的底层物理存储介质上(例如将热数据存放在高速 NVMe SSD 表空间,将历史归档数据存放在大容量 HDD 存储上)。

pg_tablespace_size() 能够计算并返回指定表空间在物理磁盘上所消耗的全部实际字节数,是编写自动化磁盘满载报警、表空间容量规划和多存储介质负载均衡脚本的核心函数。

PostgreSQL pg_tablespace_size() 语法

这里是 PostgreSQL pg_tablespace_size() 函数的标准语法:

pg_tablespace_size(tablespace)

PostgreSQL 提供了两种入参形态:

  • pg_tablespace_size(oid) -> bigint
  • pg_tablespace_size(name) -> bigint

参数

tablespace
必需的。目标表空间的名称(name 类型,如 'pg_default'、'pg_global' 或用户自定义表空间名称),或者该表空间在 pg_tablespace 系统目录中的数字 OID。

返回值

返回一个 bigint 整数,代表该表空间当前在宿主机文件系统中所占用的物理磁盘字节总数:

  • 若指定的表空间名称或 OID 不存在,函数将抛出错误。
  • 若入参为 NULL,则返回 NULL。

PostgreSQL pg_tablespace_size() 示例

以下示例演示从系统默认表空间查询到全实例表空间存储监控的常见用法。

查询系统内置表空间大小

PostgreSQL 默认包含两个系统表空间:存放用户业务数据的 pg_default 和存放全局系统表(如 pg_database、pg_authid)的 pg_global:

SELECT 
    'pg_default' AS spcname,
    pg_size_pretty(pg_tablespace_size('pg_default')) AS default_space_size,
    'pg_global' AS global_name,
    pg_size_pretty(pg_tablespace_size('pg_global')) AS global_space_size;

输出:

  spcname   | default_space_size | global_name | global_space_size 
------------+--------------------+-------------+-------------------
 pg_default | 85 GB              | pg_global   | 584 kB

全实例表空间容量统计与监控报表

编写一个全面的 SQL 脚本,列出当前 PostgreSQL 实例中所有的表空间、物理挂载路径及其已用空间:

SELECT 
    spcname AS tablespace_name,
    pg_tablespace_location(oid) AS physical_location,
    pg_size_pretty(pg_tablespace_size(oid)) AS used_disk_space,
    pg_tablespace_size(oid) AS bytes_raw
FROM pg_tablespace
ORDER BY pg_tablespace_size(oid) DESC;

输出:

 tablespace_name | physical_location           | used_disk_space | bytes_raw   
-----------------+-----------------------------+-----------------+-------------
 fast_ssd_space  | /data/ssd/pg_tblspc         | 180 GB          | 193273528320
 pg_default      |                             | 85 GB           | 91268055040
 archive_space   | /mnt/cold_storage/pg_tblspc | 450 GB          | 483183820800
 pg_global       |                             | 584 kB          | 598016

通过此监控视图,运维团队可以清晰掌握各底层磁盘分区的占用情况,并在使用率触及 80% 警戒线前主动扩容或迁移表对象。

结论

  • pg_tablespace_size() 统揽了该表空间下归属的所有数据库对应对象文件的物理磁盘开销。
  • 只有超级用户(Superuser)或拥有特定管理角色的用户才能查询某些敏感表空间的物理细节;普通只读用户在受限环境下可能无权执行该函数。
  • 结合 Linux 宿主机的 df -h 监控命令,可实现数据库内部对象视角与操作系统存储视角的双向闭环容量管理。