创建和管理表空间

创建和管理表空间

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

一个表空间需要一个文件系统位置来存放它的数据库文件。在Greenplum数据库中,Master和每一个Segment(主要和镜像)要求不同的存储位置。一个Greenplum数据库中所有部件所需的文件系统位置集合被称作一个文件空间。文件空间可以被一个或者多个表空间使用。

创建一个文件空间

一个文件空间会为用户的Greenplum系统留出存储位置。一个文件空间是一个符号存储标识符,它映射到用户的Greenplum主机文件系统中的一组位置。要创建一个文件空间,应在用户所有的Greenplum主机上准备好逻辑文件系统,然后使用gpfilespace工具来定义文件空间。用户必须是一个数据库超级用户才能创建文件空间。

注意: Greenplum数据库并不会直接意识到在用户底层系统上的文件系统边界。它只会在用户告诉它要使用的目录中存放文件。用户无法在一个逻辑文件系统中控制单个文件在磁盘上的位置。

使用gpfilespace创建一个文件空间

  1. 作为gpadmin用户登入到Greenplum数据库的Master。
    $ su - gpadmin
  2. 创建一个文件空间配置文件:
    $ gpfilespace -o gpfilespace_config
  3. 在提示符处,输入该文件空间的名称、主要Segment文件系统的位置、镜像Segment文件系统的位置以及Master文件系统的位置。主要和镜像位置引用Segment主机上的目录,Master位置引用Master主机和后备Master(如果配置)上的一个目录。例如,如果用户的配置在每个主机上有2个主要Segment和2个镜像Segment:
    Enter a name for this filespace> fastdisk
    primary location 1> /gpfs1/seg1
    primary location 2> /gpfs1/seg2
    mirror location 1> /gpfs2/mir1
    mirror location 2> /gpfs2/mir2
    master location> /gpfs1/master
    
  4. gpfilespace会创建一个配置文件。检查该文件来验证gpfilespace配置是正确的。
  5. 再次运行gpfilespace来基于该配置文件创建该文件空间:
    $ gpfilespace -c gpfilespace_config

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

用户可以把临时或者事务文件移动到一个特定的文件空间,以便在运行查询、创建备份时改进性能,并且更加连续地存储数据。

临时和事务文件专用的文件空间由两个独立的平面文件gp_temporary_files_filespace和gp_transaction_files_filespace跟踪。它们位于每一个主要和镜像Segment、Master和后备Master上的pg_system目录中。要移动临时或者事务文件,用户必须是一个超级用户。只有gpfilespace工具能写入到这个文件。

关于临时和事务文件

除非另外指定,临时和事务文件和所有的用户数据存储在一起。当用户第一次使用gpfilespace --movetempfiles时,默认的临时文件位置<filespace_directory>/<tablespace_oid>/<database_oid>/pgsql_tmp会被改变。

还要注意以下关于临时或者事务文件的信息:

  • 用户只能把一个文件空间专用于临时或者事务文件,不过用户可以使用同一个文件空间来存放其他类型的文件。
  • 如果一个文件空间被临时文件使用,用户就不能删除它。
  • 用户必须先创建文件空间。参见创建一个文件空间

使用gpfilespace移动临时文件

  1. 检查文件空间存在并且和用于存放所有其他用户数据的文件空间不同。
  2. 发出smart关闭让Greenplum数据库下线。

    如果还有连接在进行中,gpfilespace --movetempfiles工具将会失败。

  3. 将Greenplum数据库上线但没有活动会话,并且运行下面的命令:
    gpfilespace --movetempfilespace filespace_name

    临时文件的位置存储在Segment的配置共享内存(PMModuleState)中并且在创建、打开或者删除临时文件时使用。

  1. 检查文件空间存在并且与存放所有其他用户数据库的文件空间不同。
  2. 发出smart关闭让Greenplum数据库下线。

    如果还有连接在进行中,gpfilespace --movetransfiles工具将会失败。

  3. 将Greenplum数据库上线但没有活动会话,并且运行下面的命令:
    gpfilespace --movetransfilespace filespace_name

    事务文件的位置存储在Segment的配置共享内存(PMModuleState)中并且在创建、打开或者删除事务文件时使用。

创建一个表空间

在用户创建了一个文件空间后,可使用CREATE TABLESPACE命令定义一个使用该文件空间的表空间。例如:

=# CREATE TABLESPACE fastspace FILESPACE fastdisk;

数据库超级用户可以用GRANTCREATE command定义表空间并且为数据库用户授予访问权限。例如:

=# 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 and CREATE INDEX命令指定默认表空间:

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

与一个数据库相关的表空间存放着该数据库的系统目录、使用该数据库的服务器进程创建的临时文件,并且在创建对象(表和索引)且没有指定TABLESPACE时充当该数据库中的默认表空间。如果用户在创建一个数据库时没有为它指定表空间,该数据库将使用与其模板数据库相同的表空间。

如果有适当的特权,用户可以从任何数据库使用一个表空间。

查看现有的表空间和文件空间

每一个Greenplum数据库系统都有下列默认的表空间。

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

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

文件空间的信息可以在目录表pg_filespacepg_filespace_entry中查找。用户可以把这些表与pg_tablespace连接起来查看一个表空间的完整定义。例如:

=# SELECT spcname as tblspc, fsname as filespc, 
          fsedbid as seg_dbid, fselocation as datadir 
   FROM   pg_tablespace pgts, pg_filespace pgfs, 
          pg_filespace_entry pgfse 
   WHERE  pgts.spcfsoid=pgfse.fsefsoid 
          AND pgfse.fsefsoid=pgfs.oid 
   ORDER BY tblspc, seg_dbid;

删除表空间和文件空间

要删除一个表空间,用户必须是该表空间的拥有者或者超级用户。如果要删除一个表空间,只有在所有数据库中所有使用该表空间的对象都被删除之后才能做到。

只有超级用户才能删除一个文件空间。只有所有使用一个文件空间的表空间都被移除后,该文件空间才能被删除。

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

DROP FILESPACE命令移除一个空的文件空间。

注意:如果一个文件空间存储着临时或者事务文件,用户不能删除它。