PostgreSQL中的表空间允许数据库管理员在文件系统中定义用来 存放表示数据库对象的文件的位置。
一旦被创建, 表空间就可以在创建数据库对象时通过名称引用。
通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。
注意:即便是位于主要的 PostgreSQL 数据目录之外,表空间也是数据库集簇的一部分 并且不能被视作数据文件的一个自治集合。
如果丢失一个表空间(文件删除、磁盘失效等), 数据库集簇可能会变成不可读或者无法启动。把一个表空间放在一个临时文件
系统 (如一个RAM磁盘)上会带来整个集簇的可靠性风险。
CREATE TABLESPACE fastspace LOCATION ’/ssd1/postgresql/data’;
这个位置必须是一个已有的空目录,并且属于PostgreSQL操作系统用户。
表、索引和整个数据库都可以被分配到特定的表空间。
CREATE TABLE foo(i int) TABLESPACE space1;
SET default_tablespace = space1;
CREATE TABLE foo(i int);
还有一个temp_tablespaces参数,它决定临时表和索引的位置, 以及如用于大数据集排序等目的的临时文件的位置。
与一个数据库相关联的表空间用来存储该数据库的系统目录。此外,如果没有给出TABLESPACE子句并且没有在
default_tablespace或 temp_tablespaces(如适用)中指定其他选择, 它还是在该数据库中创建的表、索引
和临时文件的默认表空间。 如果创建数据库时没有声明表空间,它会使用与模板数据库相同的表空间。
当初始化数据库集簇时,会自动创建两个表空间。pg_global 表空间被用于共享系统目录。
pg_default表空间是template1 和template0数据库的默认表空间(并且, 因此也将是所有其他数据库的默认表空间
,除非被一个CREATE DATABASE 中的TABLESPACE子句覆盖)。
表空间一旦被创建,就可以被任何数据库使用,前提是发出请求的用户具有足够的权限。
要删除一个空的表空间,使用DROP TABLESPACE命令。
要确定现有表空间的集合,可检查pg_tablespace 系统目录,例如
postgres=# SELECT spcname FROM pg_tablespace;
spcname
------------
pg_default
pg_global
(2 rows)
postgres=# \db
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
PostgreSQL使用符号连接来简化表空间的实现。 这就意味着表空间只能在支持符号连接的系统上使用。