2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本: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 FROM pg_tablespace;

psql 程序的 \db 元命令对于列出现有表空间也很有用。

目录 $PGDATA/pg_tblspc 包含指向集群中定义的每个非内置表空间的符号链接。虽然不建议这样做,但可以通过重新定义这些链接来手动调整表空间布局。在服务器运行时,切勿执行此操作。请注意,在 PostgreSQL 9.1 及更早版本中,您还需要使用新位置更新 pg_tablespace 目录。(如果您不这样做,pg_dump 将继续输出旧的表空间位置。)

提交更正

如果您在文档中发现任何错误,不符合您对特定功能的体验,或者需要进一步说明,请使用 此表格 报告文档问题。