PostgreSQL 目前不具备直接公开磁盘空间的功能。
一方面,哪个磁盘?生产 PostgreSQL 实例通常如下所示:
-
/pg/pg94/
:WB 模式下 BBU RAID 控制器上快速可靠存储的 RAID6,用于目录和最重要的数据
-
/pg/pg94/pg_xlog
:快速可靠的 RAID1,用于事务日志
-
/pg/tablespace-lowredundancy
:快速廉价的 RAID10 存储,用于索引和UNLOGGED
您不关心丢失的表,因此您可以使用较低冗余的存储
-
/pg/tablespace-bulkdata
:RAID6 或类似的慢速近线磁存储,用于旧的审核日志、历史数据、主要写入数据以及其他访问速度较慢的内容。
- postgreSQL 日志通常又在其他地方,但如果填满,系统可能仍会停止。其中取决于许多配置设置,其中一些您根本无法从 PostgreSQL 中看到,例如 syslog 选项。
然后,“可用”空间并不一定意味着 PostgreSQL 可以使用它(想想:磁盘配额、系统保留的磁盘空间),而且可用空间blocks/bytes并不是唯一的限制,因为许多文件系统也对文件(索引节点)数量有限制。
一个如何SELECT pg_get_free_disk_space()
报告这个?
了解可用磁盘空间可能是一个安全问题。如果支持的话,它至少只会暴露给超级用户。
你什么can要做的是使用不受信任的过程语言,例如plpythonu
进行操作系统调用来询问主机操作系统的磁盘空间信息,使用针对pg_catalog.pg_tablespace
并使用data_directory
设置从pg_settings
发现 PostgreSQL 在主机操作系统上保存内容的位置。您还必须检查安装点 (unix/Mac) / 连接点 (Windows) 以发现是否pg_xlog
等都在单独的存储中。不过,这仍然无法真正帮助您获得日志空间。
我很想有一个SELECT * FROM pg_get_free_diskspace
报告了主要的 datadir 空间,以及其中的任何安装点或连接点,例如pg_xlog
or pg_clog
,并报告每个表空间及其中的任何安装点。它是一个返回集合的函数。足够关心的人一定会费心去实施它适用于所有目标平台不过,现在没有人想要足够的钱来完成这项工作。
同时,如果您愿意简化您的需求:
- 一个文件系统
- 目标操作系统与 UNIX/POSIX 兼容,如 Linux
- 没有启用配额系统
- 没有根保留块百分比
- 索引节点耗尽不是问题
然后你可以CREATE LANGUAGE plpython3u;
and CREATE FUNCTION
a LANGUAGE plpython3u
函数执行如下操作:
import os
st = os.statvfs(datadir_path)
return st.f_bavail * st.f_frsize
在一个函数中returns bigint
并且要么采取datadir_path
作为参数,或者通过执行 SPI 查询来发现它,例如SELECT setting FROM pg_settings WHERE name = 'data_directory'
来自 PL/Python 内部。
如果您也想支持 Windows,请参阅使用 python 计算卷上剩余的跨平台空间 https://stackoverflow.com/q/51658/398670。不过,我会使用 Windows 管理接口 (WMI) 查询,而不是使用 ctypes 来调用 Windows API。
或者你可以使用某人用 PL/Perlu 编写的这个函数 https://wiki.postgresql.org/wiki/Free_disk_space使用df
and mount
命令输出解析,这可能只适用于 Linux,但是,嘿,它是预先写好的。