支持的版本:当前 (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 FROM pg_tablespace;

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

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

提交更正

如果您发现文档中任何不正确、与您使用特定功能的经验不符或需要进一步说明的内容,请使用此表单报告文档问题。