9.3 9.4 9.5 9.6 10 11 12 13 14 15 16 17 Current(18)
PostgreSQL中文社区 问题报告 纠错本页面

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