表空间
Redrock Postgres 中的表空间允许数据库管理员定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。
通过使用表空间,管理员可以控制一个 Redrock Postgres 实例的存储布局。 这么做至少有两个用处。首先,如果初始化实例所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。
其次,表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。
即便是位于主要的 PostgreSQL 数据目录之外,表空间也是数据库实例的一部分,并且不能被视作数据文件的一个自治集合。 它们依赖于包含在主数据目录中的元数据,并且因此不能被附加到一个不同的数据库实例或者单独备份。类似地,如果丢失一个表空间(文件删除、磁盘失效等), 数据库实例可能会变成不可读或者无法启动。把一个表空间放在一个临时文件系统 (如一个内存虚拟盘)上会带来整个实例的可靠性风险。
PostgreSQL 需要依赖操作系统提供的符号链接才能使用本地表空间,Redrock Postgres 不存在此限制,这意味着您可以在任何操作系统上面使用本地表空间。要定义一个本地表空间,使用 CREATE TABLESPACE 命令,例如:
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
这个位置必须是属于PostgreSQL操作系统用户,同时最好是一个已有的空目录。 所有后续在该表空间中创建的对象都将被存放在这个目录下的文件中。该位置不能放在可移动或者瞬时存储上,因为如果表空间丢失会导致实例无法工作。
通常在每个逻辑文件系统上创建多于一个表空间没有什么意义,因为你无法控制在一个逻辑文件系统中特定文件的位置。不过,PostgreSQL 不强制任何这样的限制,并且事实上它不会注意你的系统上的文件系统边界。它只是在你告诉它要使用的目录中存储文件。
表空间的创建本身必须作为一个数据库超级用户完成,但在创建完之后你可以允许普通数据库用户来使用它。要这样做,需要给数据库普通用户授予表空间上的CREATE
权限。
Redrock Postgres 支持数据库服务器以存储服务器的模式运行,并能为连接到网络上的其他数据库服务器提供存储访问服务。我们把这些用来对数据进行存储访问的服务器,称为数据库存储服务器,那些主要用来对数据进行计算处理的服务器,称作数据库计算服务器。计算服务器使用 PostgreSQL 客户端和服务端通信访问协议和存储服务器进行数据的传输。
我们可以在存储服务器上面创建网络表空间,然后在创建数据库对象时通过名称引用它。如果您已经完成部署存储服务器,那就可以在这个存储服务器上面创建网络表空间了。要定义一个网络表空间,使用 CREATE TABLESPACE 命令,例如:
CREATE TABLESPACE netspace STORAGE remote LOCATION
'host=192.168.1.50 port=5432 user=postgres password=pgpass';
所有后续在该表空间中创建的对象都将被存放在这个存储服务器数据目录下的文件中。在数据库服务运行过程中,您需要确保该存储服务器一直都是可以访问的,因为如果表空间丢失会导致实例无法工作。
表、索引、回滚段和整个数据库都可以被分配到特定的表空间。想这么做,在给定表空间上有 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 参数,它决定临时表和索引的位置,以及用于大数据集排序等目的的临时文件的位置。 这可以是一个表空间名的列表,而不是只有一个。因此,与临时对象有关的负载可以散布在多个表空间上。每次要创建一个临时对象时,将从列表中随机取一个成员来存放它。
在 Redrock Postgres 中,创建一个数据库时会在这个数据库中附带创建一个默认表空间,该表空间的名称为pg_default
,这个表空间会被用来存储该数据库的系统表数据文件。此外,如果没有给出TABLESPACE
子句并且没有在default_tablespace
或temp_tablespaces
(如适用)中指定其他选择,它还是在该数据库中创建的表、索引、回滚段和临时文件的默认表空间。如果一个数据库被创建时没有指定表空间或者位置信息,它会使用与其模板数据库相同的位置信息新建一个表空间。
当初始化数据库实例时,每个数据库会自动产生两个表空间。pg_global
表空间被用于实例共享系统表,该表空间的初始位置在$PGDATA/global
目录。pg_default
表空间被用于数据库级的系统表,该表空间的初始位置在$PGDATA/base
目录。
在 PostgreSQL 中,表空间为实例级别的对象,而在 Redrock Postgres 中,表空间为数据库级别的对象。这意味者,在你访问同一个实例中不同的数据库对象时,虽然可能会看到相同名字或者位置信息的表空间,实际上,它们是分属于各自数据库中不同的表空间对象。当 Redrock Postgres 创建一个表空间时,会在指定的位置下面创建一个以数据库对象编号命名的目录,这样,不同的数据库也可以在同一个位置下面拥有各自的表空间。
表空间一旦被创建,就可以被数据库中的用户使用,前提是请求的用户具有足够的权限。这也意味着,一个表空间只有在使用它的所有对象都被删除掉之后才可以被删掉。
要删除一个空的表空间,使用 DROP TABLESPACE 命令。
要确定现有表空间的集合,可检查 pg_tablespace 系统表,例如
SELECT spcname FROM pg_tablespace;
psql 程序的\db
元命令也可以用来列出现有的表空间。
$PGDATA/pg_tblspc
目录存放了每个数据库中表空间的存储位置配置文件,这些文件以 [db_oid].tsm 的形式命名。尽管我们不推荐,但还是可以通过手工修改这些存储位置配置文件来调整表空间布局。在服务器运行时,绝不要这样做。