我一直在努力使我们的数据库客户端积极主动地不填写他们使用的数据库所居住的分区。

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

adb=> select * from pg_tablespace;

  spcname   | spcowner |    spclocation    |       spcacl        
------------+----------+-------------------+---------------------
 pg_default |       10 |                   | 
 pg_global  |       10 |                   | 
 adb        |  2033793 | /database/adb     | {adb=C/adb}

我看不出客户如何获得通往全局表空间存储的路径;在上面的查询中返回一个空字符串。

不幸的是,我们在全球表空间中创建的特定数据库中有许多旧系统,这将是一项巨大的努力,将其移至用户创建的表空间。

希望我只是错过了真正简单的东西。

有帮助吗?

解决方案

pg_defaultpg_global 位置是“硬编码”。

pg_default 住在:

select setting||'/base' from pg_settings where name='data_directory';

pg_global 住在:

select setting||'/global' from pg_settings where name='data_directory';

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

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

app01@postgres=> show data_directory;
ERROR:  must be superuser to examine "data_directory"

其他提示

PostgreSQL创建 pg_defaultpg_global 当您创建集群时,也许是通过使用 initdb 直接地。这 initdb 实用程序可以采用设置数据目录的参数,但没有关于将其放在哪里的论点 pg_defaultpg_global tablespaces.

我得出结论,它们总是在数据目录中创建。我很容易错过。我认为它们不会被移动。我也可能错了。

但是,如果我到目前为止,您可以通过

show data_directory;

pg_global tablespace 几乎可以肯定是“全球”子目录; pg_default 可能也是。

如果我有时间,我会读 源代码. 。那将消除所有疑问。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top