PostgreSQL:查询全局表空间的位置?

Pet*_*ter 8 postgresql disk-space

我一直在努力让我们的数据库客户端主动避免填满他们正在使用的数据库所在的分区。

由于我们所有的客户端都与数据库管理器在同一台主机上,因此对于用户创建的表空间来说应该很容易;客户端可以查找表空间的文件系统路径(在 spclocation 中),并使用操作系统调用来检查有多少可用空间:

adb=> select * from pg_tablespace;

  spcname   | spcowner |    spclocation    |       spcacl        
------------+----------+-------------------+---------------------
 pg_default |       10 |                   | 
 pg_global  |       10 |                   | 
 adb        |  2033793 | /database/adb     | {adb=C/adb}
Run Code Online (Sandbox Code Playgroud)

我无法从客户端看到如何获取全局表空间存储位置的路径;在上面的查询中为它返回一个空字符串。

不幸的是,我们在该领域有许多遗留系统使用在全局表空间中创建的特定数据库,将它移到用户创建的表空间中将是一项巨大的努力。

希望我只是错过了一些非常简单的东西。

fil*_*rem 13

pg_defaultpg_global位置是“硬编码”的。

pg_default 住在:

select setting||'/base' from pg_settings where name='data_directory';
Run Code Online (Sandbox Code Playgroud)

pg_global住在:

select setting||'/global' from pg_settings where name='data_directory';
Run Code Online (Sandbox Code Playgroud)

src/backend/commands/tablespace.c 是这样说的:

 * There are two tablespaces created at initdb time: pg_global (for shared
 * tables) and pg_default (for everything else).  For backwards compatibility
 * and to remain functional on platforms without symlinks, these tablespaces
 * are accessed specially: they are respectively
 *          $PGDATA/global/relfilenode
 *          $PGDATA/base/dboid/relfilenode
Run Code Online (Sandbox Code Playgroud)

另请注意,暴露数据目录的位置是一个 - 不是那么可怕但仍然 - 安全漏洞。

app01@postgres=> show data_directory;
ERROR:  must be superuser to examine "data_directory"
Run Code Online (Sandbox Code Playgroud)