我一直在努力让我们的数据库客户端积极主动地不填满他们使用的数据库所在的分区。
由于我们所有的客户端都与数据库管理器位于同一主机上,因此对于用户创建的表空间应该很容易;客户端可以查找表空间的文件系统路径(在 spclocation 中),并使用操作系统调用来检查有多少可用空间:
adb=> select * from pg_tablespace;
spcname | spcowner | spclocation | spcacl
------------+----------+-------------------+---------------------
pg_default | 10 | |
pg_global | 10 | |
adb | 2033793 | /database/adb | {adb=C/adb}
我看不到如何从客户端获取存储全局表空间的路径;在上面的查询中为它返回一个空字符串。
不幸的是,我们在该领域有许多遗留系统使用在全局表空间中创建的特定数据库,将其移动到用户创建的表空间中将是一项巨大的努力。
希望我只是错过了一些非常简单的东西。
pg_default
并且pg_global
位置是“硬编码的”。pg_default
住在:住
pg_global
在:src/backend/commands/tablespace.c
这么说:另请注意,数据目录的暴露位置是一个 - 不是那么可怕但仍然 - 安全漏洞。
PostgreSQL 创建
pg_default
和pg_global
创建集群时,可能initdb
直接使用。该initdb
实用程序可以接受一个设置数据目录的参数,但没有关于将pg_default
and放在哪里的参数pg_global tablespaces
。我会得出结论,它们总是在数据目录中创建的。我很容易就错了。我不认为他们可以被移动。我也可能是错的。
但如果我是正确的到这一点,你可以推导出他们的物理位置
pg_global tablespace
几乎可以肯定是“全局”子目录;pg_default
可能也是。如果我有时间,我会阅读源代码。这将消除所有疑虑。