创建和管理表空间
创建和管理表空间
表空间允许数据库管理员在每台机器上拥有多个文件系统并且决定如何最好地使用物理存储来存放数据库对象。
表空间允许用户为频繁使用和不频繁使用的数据库对象分配不同的存储,或者在特定的数据库对象上控制I/O性能。
例如,把频繁使用的表放在使用高性能固态驱动器(SSD)的文件系统上,而把其他表放在标准的磁盘驱动器上。
表空间需要一个主机文件系统位置来存储其数据库文件。 在SeaboxMPP数据库中,文件系统位置必须存在于包括运行所有coordinator和每个primary和mirror的所有主机上。
表空间是SeaboxMPP数据库系统对象(全局对象),如果有权限的话,可以使用任何数据库中的表空间。
创建表空间
CREATE TABLESPACE
命令创建一个表空间。例如:
CREATE TABLESPACE fastspace LOCATION '/fastdisk/scdb';
数据库超级用户定义表空间并通过GRANT
CREATE
命令赋予数据库用户访问权限。 例如:
GRANT CREATE ON TABLESPACE fastspace TO admin;
使用表空间来存储数据库对象
在一个表空间上拥有CREATE
特权的用户可以在其中创建数据库对象,例如表、索引和数据库。命令是:
CREATE TABLE tablename(options) TABLESPACE spacename
例如,下列命令在表空间space1中创建一个表:
CREATE TABLE foo(i int) TABLESPACE space1;
用户也可以使用default_tablespace
参数为没有指定表空间的 CREATE TABLE
和CREATE
INDEX
命令指定默认表空间:
SET default_tablespace = space1;
CREATE TABLE foo(i int);
还有temp_tablespaces
配置参数,该参数确定临时表和索引以及用于诸如对大型数据集进行排序之类目的的临时文件的位置。
这可以是表空间名称的逗号分隔列表,而不是仅一个,因此与临时对象相关的负载可以分布在多个表空间上。
每次要创建临时对象时,都会选择列表的随机成员。
与数据库关联的表空间存储该数据库的系统目录,服务器进程使用该数据库创建的临时文件,
并且是为数据库内创建的表和索引选择的默认表空间(如果在创建对象时未指定TABLESPACE
的话)。
如果有足够的权限的话,可以使用任何数据库的表空间。
查看已有的表空间
每个SeaboxMPP数据库系统有如下默认表空间。
pg_global
用于共享系统的catalogs。
pg_default
,默认表空间。由template1和template0数据库使用。
这些表空间使用系统的默认文件空间,其数据目录位置在系统初始化时被创建。
要查看表空间信息,请从pg_tablespace
catalog表获取表空间的对象ID(OID),
然后使用sc_tablespace_location()
函数显示表空间路径。
下面是一个包含有一个用户定义的表空间myspace
的例子:
SELECT oid, * FROM pg_tablespace ;
oid | spcname | spcowner | spcacl | spcoptions
-------+------------+----------+--------+------------
1663 | pg_default | 10 | |
1664 | pg_global | 10 | |
16391 | myspace | 10 | |
(3 rows)
myspace
表空间的OID是16391
。
运行sc_tablespace_location()
显示了系统中包含两个节点和coordinator的表空间位置。
# SELECT * FROM sc_tablespace_location(16391);
sc_dbindex_id | tblspc_loc
---------------+------------------
0 | /data/mytblspace
1 | /data/mytblspace
-1 | /data/mytblspace
(3 rows)
这个查询使用sc_tablespace_location()
和catalog表sc_node_configuration
显示包含myspace
表空间文件系统路径的节点实例信息。
WITH spc AS (SELECT * FROM sc_tablespace_location(16391))
SELECT seg.role, spc.sc_dbindex_id as seg_id, seg.hostname, seg.datadir, tblspc_loc
FROM spc, sc_node_configuration AS seg
WHERE spc.sc_dbindex_id = seg.content ORDER BY seg_id;
这是一个在单一宿主机上包含两个节点和coordinator的测试系统的信息。
role | seg_id | hostname | datadir | tblspc_loc
------+--------+----------+----------------------+------------------
p | -1 | testhost | /data/coordinator/sc-seg-1 | /data/mytblspace
p | 0 | testhost | /data/data1/sc-seg0 | /data/mytblspace
p | 1 | testhost | /data/data2/sc-seg1 | /data/mytblspace
(3 rows)
删除表空间
要删除表空间,必须是表空间的所有者或者超级用户。直到所有依赖该表空间的对象都被删除才可以删除该表空间。
DROP TABLESPACE
命令删除一个空的表空间。
注意无法删除一个非空或存储了临时或事务文件的表空间。
移动临时或事务文件的位置
您可以将临时文件或事务文件移动到特定的表空间,以在运行查询,创建备份和更顺序地存储数据时提高数据库性能。
SeaboxMPP数据库服务器配置参数temp_tablespaces
控制哈希聚合和哈希连接查询的临时表和临时溢出文件的位置。
(用于排序大型数据集等目的的临时文件与<data_dir>/<seg_ID>/base/pgsql_tmp
中的常规段数据一起存储。)
当CREATE
命令没有显式指定表空间时,
temp_tablespaces
指定了创建临时对象时使用的表空间(临时表和临时表上的index)。
另请注意有关临时文件或事务文件的以下信息:
- 尽管您可以使用相同的表空间来存储其他类型的文件,但只能将一个表空间专用于临时文件或事务文件。
- 无法删除一个被临时文件使用的表空间。