select pg_get_free_disk_space();
可能吗? (我在docs中找不到任何关于它的内容).
PG:9.3&操作系统:Linux / Windows
解决方法
一方面,哪个磁盘?生产Postgresql实例通常如下所示:
> / pg / pg94 /:WB模式下BBU RAID控制器上快速可靠存储的RAID6,用于目录和最重要的数据
> / pg / pg94 / pg_xlog:一个快速可靠的RAID1,用于事务日志
> / pg / tablespace-lowredundancy:用于索引和UNLOGGED表等快速廉价存储的RAID10,您不必担心丢失,因此可以使用低冗余存储
> / pg / tablespace-bulkdata:RAID6或类似的慢速近线磁存储,用于旧审计日志,历史数据,写入数据以及其他可能较慢访问的内容.
> postgresql日志通常在其他地方再次出现,但是如果这个填满,系统可能仍会停止.哪里取决于许多配置设置,其中一些你根本无法从Postgresql中看到,比如syslog选项.
然后就是“自由”空间并不一定意味着Postgresql可以使用它(想想:磁盘配额,系统保留磁盘空间),以及空闲块/字节不是唯一约束的事实,就像许多文件系统一样对文件数量(inode)也有限制.
aSELECT pg_get_free_disk_space()如何报告此情况?
了解可用磁盘空间可能是一个安全问题.如果受到支持,那至少只会暴露给超级用户.
您可以做的是使用不受信任的过程语言(如plpythonu)来进行操作系统调用,以查询主机操作系统的磁盘空间信息,使用针对pg_catalog.pg_tablespace的查询并使用pg_settings中的data_directory设置来发现Postgresql在主机上保留内容的位置OS.您还必须检查挂载点(unix / Mac)/交接点(Windows)以发现pg_xlog等是否位于单独的存储上.但是,这仍然无法真正帮助您获取日志空间.
我非常希望有一个SELECT * FROM pg_get_free_diskspace报告主datadir空间,以及其中的任何挂载点或连接点,如pg_xlog或pg_clog,并且还报告每个表空间及其中的任何挂载点.这是一个回归功能.足够关心的人不得不费心去为所有目标平台实施它,而且现在,没有人希望它能够完成这项工作.
与此同时,如果您愿意将您的需求简化为:
>一个文件系统
>目标操作系统与Linux兼容,与UNIX / POSIX兼容
>没有启用配额系统
>没有根保留块百分比
> inode耗尽不是问题
那么你可以创建语言plpython3u;和CREATE FUNCTION一个语言plpython3u函数,它可以执行以下操作:
import os st = os.statvfs(datadir_path) return st.f_bavail * st.f_frsize
在返回bigint的函数中,或者将datadir_path作为参数,或者通过执行SPI查询来发现它,例如PL / Python中的SELECT设置FROM pg_settings WHERE name =’data_directory’.
如果您也想支持Windows,请参阅Cross-platform space remaining on volume using python.我使用Windows管理界面(WMI)查询而不是使用ctypes来调用Windows API.
或者您可以使用df和mount命令输出解析来执行此操作,这可能仅适用于Linux,但是,它是预先编写的.