数据库PostrageSQL-表空间

22.6. 表空间

PostgreSQL中的表空间容许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被建立,表空间就能够在建立数据库对象时经过名称引用。java

经过使用表空间,管理员能够控制一个PostgreSQL安装的磁盘布局。 这么作至少有两个用处。首先,若是初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者作别的什么操做,那么表空间能够被建立在一个不一样的分区上,直到系统能够被从新配置。web

其次,表空间容许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引能够被放在很是快而且很是可靠的磁盘上,如一种很是贵的固态设备。同时,一个不多使用的或者对性能要求不高的存储归档数据的表能够存储在一个便宜但比较慢的磁盘系统sql

即使是位于主要的 PostgreSQL 数据目录以外,表空间也是数据库集簇的一部
分 而且不能被视做数据文件的一个自治集合。 它们依赖于包含在主数据目录
中的元数据,而且所以不能被附加到一个 不一样的数据库集簇或者单独备份。
相似地,若是丢失一个表空间(文件删除、磁盘失效等), 数据库集簇可能
会变成不可读或者没法启动。把一个表空间放在一个临时文件系统 (如一个
内存虚拟盘)上会带来整个集簇的可靠性风险。数据库

要定义一个表空间,使用CREATE TABLESPACE命令,例如:服务器

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

这个位置必须是一个已有的空目录,而且属于PostgreSQL操做系统用户。 全部后续在该表空间中建立的对象都将被存放在这个目录下的文件中。该位置不能放在可移动 或者瞬时存储上,由于若是表空间丢失会致使集簇没法工做。svg

一般在每一个逻辑文件系统上建立多于一个表空间没有什么意义,由于你没法控制在一个逻辑文件系统中特定文件的位置。不过,PostgreSQL不强制任何这样的限制,而且事实上它不会注意你的系统上的文件系统边界。它只是在你告诉它要使用的目录中存储文件。布局

表空间的建立自己必须做为一个数据库超级用户完成,但在建立完以后以后你能够容许普通数据库用户来使用它。要这样作,给数据库普通用户授予表空间上的CREATE权限。post

表、索引和整个数据库均可以被分配到特定的表空间。想这么作,在给定表空间上有 CREATE权限的用户必须把表空间的名字以一个参数的形式传递给相关的命令。例如,下面的命令在表空间space1中建立一个表:性能

CREATE TABLE foo(i int) TABLESPACE space1;

另外,还可使用default_tablespace参数:大数据

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

default_tablespace被设置为非空字符串,那么它就为没有显式TABLESPACE子句的CREATE TABLE和CREATE INDEX命令提供一个隐式TABLESPACE子句。

还有一个temp_tablespaces参数,它决定临时表和索引的位置,以及用于大数据集排序等目的的临时文件的位置。 这能够是一个表空间名的列表,而不是只有一个。所以,与临时对象有关的负载能够散布在多个表空间上。每次要建立一个临时对象时,将从列表中随机取一个成员来存放它。

与一个数据库相关联的表空间用来存储该数据库的系统目录。此外,若是没有给出TABLESPACE子句而且没有在default_tablespacetemp_tablespaces(如适用)中指定其余选择,它仍是在该数据库中建立的表、索引和临时文件的默认表空间。若是一个数据库被建立时没有指定表空间,它会使用其模板数据库相同的表空间。

当初始化数据库集簇时,会自动建立两个表空间。pg_global表空间被用于共享系统目录。pg_default表空间是template1和template0数据库的默认表空间(而且,所以也将是全部其余数据库的默认表空间,除非被一个CREATE DATABASE中的TABLESPACE子句覆盖)。

表空间一旦被建立,就能够被任何数据库使用,前提是请求的用户具备足够的权限。这也意味着,一个表空间只有在全部使用它的数据库中全部对象都被删除掉以后才能够被删掉。

要删除一个空的表空间,使用DROP TABLESPACE命令。要肯定现有表空间的集合,可检查pg_tablespace 系统目录,例如

SELECT spcname FROM pg_tablespace;

psql程序的\db元命令也能够用来列出现有的表空间。PostgreSQL使用符号链接来简化表空间的实现。这就意味着表空间只能在支持符号链接的系统上使用。

$PGDATA/pg_tblspc目录包含指向集簇中定义的每一个非内建表空间的符号链接。 尽管咱们不推荐,但仍是能够经过手工重定义这些链接来调整表空间布局。在服务器运行时,毫不要这样作。注意在 PostgreSQL 9.1 及更早的版本中,你将还须要用新位置更新pg_tablespace目录(若是你不更新,pg_dump将继续输出旧的表空间位置)。

本文同步分享在 博客“cwl_java”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索