回答

收藏

如何在Postgres中获取当前的可用磁盘空间?

技术问答 技术问答 226 人阅读 | 0 人回复 | 2023-09-13

在开始在数据库中进行某些工作之前,我需要确保至少有1Gb的可用磁盘空间。我正在寻找这样的东西:1 k/ I2 t' ]4 I! h- ]! Y& d. h
select pg_get_free_disk_space();
; m- `! a, w* d8 H9 v是否有可能?(我在文档中什么都没找到)。
- J6 g  Z6 o6 \) F* lPG:9.3&操作系统:Linux / Windows2 l$ H( I% F2 m/ P1 E3 K, C
               
; {1 v5 U$ {- O3 Z0 f解决方案:1 b8 U  V) H! X( S& k- x- R
                ! l* D( n& u, s2 L9 x$ `$ S4 {6 J
, T, g. n3 I4 Y" L: ~7 Z
) Z! ?% @* B  x* v, X4 E: S
                PostgreSQL当前没有直接暴露磁盘空间的功能。
0 N/ r" M- a0 H8 ^5 s3 l, P* Z一方面,哪个磁盘?生产型PostgreSQL实例通常如下所示:
8 \, \" {, X: ]$ b8 z  |/pg/pg94/:以WB模式在BBU RAID控制器上快速可靠存储的RAID6,用于目录和最重要的数据
  e/ F1 a& N$ U4 ^6 ]* i/pg/pg94/pg_xlog:一个快速可靠的RAID1,用于事务日志: F/ [/ ?6 x& q* k6 A9 k4 e
/pg/tablespace-lowredundancy:RAID10快速廉价的存储空间,用于存储索引和UNLOGGED表等您不需要担心丢失的东西,因此您可以使用低冗余存储空间- O9 |2 e/ L4 e7 l1 k% _  W  f
/pg/tablespace-bulkdata:RAID6或类似的慢速近线磁存储,用于旧的审计日志,历史数据,主要写数据以及其他访问速度较慢的事物。( Z( G8 `1 B$ T$ _! B# H" X
postgreSQL日志通常又位于其他地方,但是如果填满了日志,系统可能仍会停止。其中的位置取决于许多配置设置,其中有些根本无法从PostgreSQL中看到,例如syslog选项。; \+ V. X! ]! [4 p6 T- d
+ }* T. z1 R; b/ V: Q. ?
然后有一个事实,即“可用”空间并不一定意味着PostgreSQL可以使用它(请考虑:磁盘配额,系统保留的磁盘空间),以及与许多文件系统一样,可用 块 /1 Z& q0 y  B# ?& l/ B# n4 ?; n
字节 并不是唯一的限制。也对文件数(节点)有限制。6 M! C1 C) r/ v+ H$ x# X- }
如何SELECT pg_get_free_disk_space()举报呢?
( v/ g* ?* t; {知道可用磁盘空间可能是出于安全考虑。如果支持的话,至少它只对超级用户开放。
- e) k+ g* ~+ q2 w3 D6 H" B您 可以8 U  v: {3 z/ T6 {, T( W! h# U
做的是使用不受信任的过程语言,例如plpythonu进行操作系统调用以查询主机OS的磁盘空间信息,使用查询pg_catalog.pg_tablespace并使用data_directoryfrom中的设置pg_settings来发现PostgreSQL在主机OS上保留的位置。您还必须检查安装点(unix1 g9 h# v$ F! r# ]+ \
/ Mac)/连接点(Windows),以了解pg_xlog,等是否在单独的存储中。但是,这仍然无法真正为您提供日志空间。
/ \/ y( l3 z/ q我非常希望有一个SELECT * FROM
1 V0 b( F6 U$ W& t; Q4 s0 Y# fpg_get_free_diskspace报告主数据目录空间及其内部任何挂载点或结点(如forpg_xlog或)pg_clog,并且还报告了每个表空间及其内的所有挂载点。这将是一个返回集合的函数。不过,如果有人非常在意,就必须5 e# V$ K" m* ~7 e5 O" D/ I9 W
为所有目标平台 实施它,而现在,没有人希望它足够完成工作。
7 y9 r" c/ v* u0 ~' M2 e0 F
' o; V' c2 l! {. T# v8 P, S. F同时,如果您愿意简化需求,请执行以下操作:8 ?6 y/ x% W8 o8 v
一个文件系统
, [$ O3 _; ~$ `- n; T目标操作系统像Linux一样与UNIX / POSIX兼容+ w6 K% l% v" f  ^2 _. R: ?+ ^8 R
没有启用配额系统
4 o+ @: D) l7 W9 X没有根保留块百分比
4 u( `$ h* c. ?( ~/ P不用担心inode耗尽
; Q8 r1 i% y4 N- i
) v* }6 m! Y1 d, Z! j" a( Q7 s
那么你可以CREATE LANGUAGE plpython3u;和CREATE FUNCTION一个LANGUAGE: e3 k7 n* z+ n1 \: i( G7 x, ^
plpython3u,做类似的功能:7 s- X; ?1 Y5 l
import os+ O/ V: Y# |4 X) M) p5 g, C& X/ f5 {% x
st = os.statvfs(datadir_path)
2 J/ q9 @5 \+ T2 O4 F; o7 hreturn st.f_bavail * st.f_frsize
! }# ~, n+ R& e, w在一个函数中,该函数returns bigint要么datadir_path作为参数,要么通过执行SPI查询(例如SELECT setting
- c$ v& }: w1 M, V% F& EFROM pg_settings WHERE name = 'data_directory'在PL / Python中)来发现它。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则