创建和管理表空间

创建和管理表空间

表空间允许数据库管理员在每台机器上拥有多个文件系统并且决定如何最好地使用物理存储来存放数据库对象。 表空间允许用户为频繁使用和不频繁使用的数据库对象分配不同的存储,或者在特定的数据库对象上控制I/O性能。 例如,把频繁使用的表放在使用高性能固态驱动器(SSD)的文件系统上,而把其他表放在标准的磁盘驱动器上。

表空间需要一个主机文件系统位置来存储其数据库文件。 在Greenplum数据库中,文件系统位置必须存在于包括运行master,standby master和每个primary和mirror的所有主机上。

表空间是Greenplum数据库系统对象(全局对象),如果有权限的话,可以使用任何数据库中的表空间。

创建表空间

CREATE TABLESPACE命令创建一个表空间。例如:

CREATE TABLESPACE fastspace LOCATION '/fastdisk/gpdb';

数据库超级用户定义表空间并通过GRANTCREATE 命令赋予数据库用户访问权限。 例如:

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 TABLECREATE INDEX命令指定默认表空间:

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

如果在创建对象时没有指定TABLESPACE, The tablespace associated with a database stores that database's system catalogs, temporary files created by server processes using that database, and is the default tablespace selected for tables and indexes created within the database, if no TABLESPACE is specified when the objects are created. 如果在创建数据库时没有指定表空间,则使用与该数据库模板库一样的表空间。

如果有足够的权限的话,可以使用任何数据库的表空间。

查看已有的表空间

每个Greenplum数据库系统有如下默认表空间。

  • pg_global 用于共享系统的catalogs。
  • pg_default,默认表空间。由template1template0数据库使用。

这些表空间使用系统的默认文件空间,其数据目录位置在系统初始化时被创建。

要查看表空间信息,请从pg_tablespacecatalog表获取表空间的对象ID(OID), 然后使用gp_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。 运行gp_tablespace_location()显示了系统中包含两个节点和master的表空间位置。
# SELECT * FROM gp_tablespace_location(16391);
 gp_segment_id |    tblspc_loc
---------------+------------------
             0 | /data/mytblspace
             1 | /data/mytblspace
            -1 | /data/mytblspace
(3 rows)
这个查询使用gp_tablespace_location()和catalog表gp_segment_configuration 显示包含myspace表空间文件系统路径的节点实例信息。
WITH spc AS (SELECT * FROM  gp_tablespace_location(16391))
  SELECT seg.role, spc.gp_segment_id as seg_id, seg.hostname, seg.datadir, tblspc_loc 
    FROM spc, gp_segment_configuration AS seg 
    WHERE spc.gp_segment_id = seg.content ORDER BY seg_id;

这是一个在单一宿主机上包含两个节点和master的测试系统的信息。

 role | seg_id | hostname |       datadir        |    tblspc_loc
------+--------+----------+----------------------+------------------
 p    |     -1 | testhost | /data/master/gpseg-1 | /data/mytblspace
 p    |      0 | testhost | /data/data1/gpseg0   | /data/mytblspace
 p    |      1 | testhost | /data/data2/gpseg1   | /data/mytblspace
(3 rows)

删除表空间

要删除表空间,必须是表空间的所有者或者超级用户。直到所有依赖该表空间的对象都被删除才可以删除该表空间。

DROP TABLESPACE命令删除一个空的表空间。

Note: 无法删除一个非空或存储了临时或事务文件的表空间。

移动临时或事务文件的位置

您可以将临时文件或事务文件移动到特定的表空间,以在运行查询,创建备份和更顺序地存储数据时提高数据库性能。

Greenplum数据库服务器配置参数 temp_tablespaces 控制哈希聚合和哈希连接查询的临时表和临时溢出文件的位置。 (用于排序大型数据集等目的的临时文件与<data_dir>/<seg_ID>/base/pgsql_tmp中的常规段数据一起存储。)

CREATE命令没有显式指定表空间时, temp_tablespaces指定了创建临时对象时使用的表空间(临时表和临时表上的index)。

另请注意有关临时文件或事务文件的以下信息:

  • 尽管您可以使用相同的表空间来存储其他类型的文件,但只能将一个表空间专用于临时文件或事务文件。
  • 无法删除一个被临时文件使用的表空间。