2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

22.6. 表空间 #

PostgreSQL 中的表空间允许数据库管理员在文件系统中定义存储数据库对象文件的位置。创建后,在创建数据库对象时可以按名称引用表空间。

通过使用表空间,管理员可以控制 PostgreSQL 安装的磁盘布局。这至少在两种情况下很有用。首先,如果集群初始化所在的分区或卷空间不足且无法扩展,则可以在另一个分区上创建表空间并使用它,直到系统可以重新配置。

其次,表空间允许管理员利用对数据库对象使用模式的了解来优化性能。例如,一个使用非常频繁的索引可以放置在一个非常快、高可用的磁盘上,例如昂贵的固态设备。同时,存储很少使用或对性能要求不高的归档数据的表可以存储在成本较低、速度较慢的磁盘系统上。

警告

即使表空间位于 PostgreSQL 主数据目录之外,它们也是数据库集群不可或缺的一部分,并且不能被视为独立的 डेटा फाइल 集合。它们依赖于主数据目录中包含的元数据,因此不能附加到不同的数据库集群或单独备份。同样,如果您丢失了一个表空间(文件删除、磁盘故障等),数据库集群可能会变得不可读或无法启动。将表空间放在临时文件系统(如 RAM 磁盘)上会冒着整个集群可靠性的风险。

要定义表空间,请使用 CREATE TABLESPACE 命令,例如:

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

该位置必须是一个现有的、空的目录,并且由 PostgreSQL 操作系统用户拥有。之后在该表空间中创建的所有对象都将存储在此目录下的文件中。该位置不得位于可移动或临时存储上,因为如果表空间丢失或损坏,集群可能无法正常运行。

注意

通常,在一个逻辑文件系统上创建多个表空间没有多大意义,因为您无法控制逻辑文件系统内单个文件的位置。但是,PostgreSQL 不强制执行任何此类限制,事实上它并不直接了解您系统上的文件系统边界。它只是将文件存储在您告诉它使用的目录中。

表空间本身的创建必须由数据库超级用户完成,但之后您可以允许普通数据库用户使用它。为此,请授予他们对该表空间的 CREATE 权限。

表、索引和整个数据库都可以分配给特定的表空间。要做到这一点,一个拥有给定表空间 CREATE 权限的用户必须将表空间名称作为参数传递给相关命令。例如,以下命令在一个名为 space1 的表空间中创建一个表:

CREATE TABLE foo(i int) TABLESPACE space1;

或者,使用 default_tablespace 参数

SET default_tablespace = space1;
CREATE TABLE foo(i int);

default_tablespace 设置为非空字符串以外的任何值时,它会为没有显式 TABLESPACE 子句的 CREATE TABLECREATE INDEX 命令提供隐式的 TABLESPACE 子句。

还有一个 temp_tablespaces 参数,它决定了临时表和索引的放置位置,以及用于排序大型数据集等目的的临时文件的放置位置。这可以是一个表空间名称列表,而不是只有一个,这样临时对象的负载就可以分布在多个表空间上。每次创建临时对象时,都会从列表中随机选择一个成员。

数据库关联的表空间用于存储该数据库的系统目录。此外,它是数据库中创建的表、索引和临时文件的默认表空间,如果未给出 TABLESPACE 子句,并且 default_tablespacetemp_tablespaces(根据情况)未指定其他选择。如果创建数据库时未指定表空间,它将使用与它复制的模板数据库相同的表空间。

在数据库集群初始化时,会自动创建两个表空间。pg_global 表空间仅用于共享系统目录。pg_default 表空间是 template1template0 数据库的默认表空间(因此,它也将是其他数据库的默认表空间,除非在 CREATE DATABASE 中被 TABLESPACE 子句覆盖)。

创建后,只要请求用户拥有足够的权限,就可以从任何数据库中使用表空间。这意味着在删除所有使用表空间的所有数据库中的对象之前,无法删除表空间。

要删除一个空的表空间,请使用 DROP TABLESPACE 命令。

要确定现有表空间的集合,请检查 pg_tablespace 系统目录,例如:

SELECT spcname, spcowner::regrole, pg_tablespace_location(oid) FROM pg_tablespace;

可以找到哪些数据库使用了哪些表空间;请参阅 表 9.76psql 程序的 \db 元命令对于列出现有表空间也很有用。

目录 $PGDATA/pg_tblspc 包含指向集群中定义的每个非内置表空间的符号链接。虽然不推荐,但可以通过手动重新定义这些链接来调整表空间布局。在服务器运行时,绝对不要执行此操作。

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。