PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

22.6. 表空间 #

PostgreSQL 的表空间(Tablespaces)特性允许数据库管理员在宿主操作系统文件系统中自由定义物理目录位置,并将特定的数据表、索引乃至整个数据库定向存储在不同的物理存储设备上。

表空间在工程实践中具备两大核心价值: 第一,突破单存储分区的容量瓶颈。当主数据目录所在的磁盘分区空间告警且无法动态在线扩容时,可以在新的磁盘挂载点上创建新表空间,将新增大表直接存入新设备。 第二,实施分层存储性能调优(Tiered Storage)。例如将查询极其频繁的热点核心索引或订单表安置于昂贵的高速 NVMe 固态硬盘表空间中;同时将极少访问的历史冷数据归档表转移存放在大容量低成本的普通机械硬盘表空间上。

Warning

尽管表空间物理路径位于主数据目录之外,但表空间在逻辑上依然是整个数据库集群不可分割的组成部分,绝不能将其视为独立自治的文件孤岛。它们严格依赖于主数据目录中的全局系统元数据,因此不能跨集群任意挂载,也无法脱离集群单独进行冷备份。若某个表空间文件发生损坏或误删,整个数据库集群可能无法正常启动。严禁将持久性表空间建立在易失的内存盘(RAM disk)上。

创建表空间使用 CREATE TABLESPACE 命令:

CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';

所指定的物理路径必须是一个预先存在、内容为空且其所有者必须是数据库运行系统用户(如 postgres)的物理目录。创建表空间本身需要超级用户权限,创建完成后可通过 GRANT CREATE ON TABLESPACE 将使用权授予普通角色。

在创建表或索引时,通过附加 TABLESPACE 子句将其定向落盘至指定表空间:

CREATE TABLE foo(i int) TABLESPACE space1;
CREATE INDEX foo_idx ON foo(i) TABLESPACE fastspace;

也可以通过会话参数 default_tablespace 声明默认表空间,或者通过 temp_tablespaces 为复杂排序产生的大量临时文件指定专用的表空间轮询列表,以有效分摊写 I/O 争用。

集群在初始化时会自动预设创建两个系统表空间:pg_global(专用于存储跨库共享的系统表元数据)与 pg_default(作为未指定表空间时的集群全局默认落盘位置)。

删除空表空间使用 DROP TABLESPACE 命令。在所有引用该表空间的数据表与索引彻底清理完毕之前,系统严禁删除该表空间。