
# 创建和管理表空间
#### 背景信息
通过使用表空间，管理员可以控制一个数据库安装的磁盘布局。这样有以下优点：
- 如果初始化数据库所在的分区或者表空间已满，又不能逻辑上扩展更多空间，可以在不同的分区上创建和使用表空间，直到系统重新配置空间。

- 表空间允许管理员根据数据库对象的使用模式安排数据位置，从而提高性能。
  - 一个频繁使用的索引可以存储在性能稳定且运算速度较快的磁盘上，比如一种固态设备。
  
  - 一个存储归档的数据，很少使用的或者对性能要求不高的表可以存储在一个运算速度较慢的磁盘上。
   

- 管理员通过表空间可以设置占用的磁盘空间，用以在和其他数据共用分区的时候，防止表空间占用相同分区上的其他空间。
- 表空间可以控制数据库数据占用的磁盘空间。当表空间所在磁盘的使用率达到90%时，数据库将被设置为只读模式，当磁盘使用率降到90%以下时，数据库将恢复到读写模式。 建议用户使用数据库时，通过后台监控程序或者Database Manager进行磁盘空间使用率监控，以免出现数据库只读情况。
  
- 表空间对应于一个文件系统目录，比如数据库节点数据目录/pg_location/mount1/path1是用户拥有读写权限的空目录，那么可以在这个目录下创建一个绝对路径表空间。 使用表空间配额管理会使性能有30%左右的影响，MAXSIZE指定每个数据库节点的配额大小，误差范围在500MB以内。请根据实际的情况确认是否需要设置表空间的最大值。
  
GaussDB自带了两个表空间：pg_default和pg_global。
- 默认表空间pg_default：用来存储非共享系统表、用户表、用户表index、临时表、临时表index、内部临时表的默认表空间。对应存储目录为实例数据目录下的base目录。
- 共享表空间pg_global：用来存储共享系统表的表空间。对应存储目录为实例数据目录下的global目录。
 
#### 注意事项：
在公有云场景下一般不建议用户使用自定义的表空间。用户自定义表空间通常配合主存（即默认表空间所在的存储设备，如磁盘）以外的其它存储介质使用，以隔离不同业务可以使用的IO资源，而在公有云场景下，存储设备都是采用标准化的配置，无其它可用的存储介质，自定义表空间使用不当不利于系统长稳运行以及影响整体性能，因此建议使用默认表空间即可。
#### 操作步骤
- 创建表空间
  1. 执行如下命令创建用户jack。
     ```
     gaussdb=# CREATE USER jack IDENTIFIED BY '********';
     ```
     当结果显示为如下信息，则表示创建成功。
     ```
     CREATE ROLE
     ```
     
  
  2. 执行如下命令创建表空间。
     ```
     gaussdb=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'tablespace/tablespace_1';
     ```
     当结果显示为如下信息，则表示创建成功。
     ```
     CREATE TABLESPACE
     ```
     其中"fastspace"为新创建的表空间，"数据库节点数据目录*/pg_location/tablespace/tablespace_1*"是用户拥有读写权限的空目录。
     
  
  3. 数据库系统管理员执行如下命令将"fastspace"表空间的访问权限授予数据用户jack。
     ```
     gaussdb=# GRANT CREATE ON TABLESPACE fastspace TO jack;
     ```
     当结果显示为如下信息，则表示授予成功。
     ```
     GRANT
     ```
     
   
 
- 在表空间中创建对象 如果用户拥有表空间的CREATE权限，就可以在表空间上创建数据库对象，比如：表和索引等。
  以创建表为例。
  - 方式1：执行如下命令在指定表空间创建表。
    ```
    gaussdb=# CREATE TABLE foo(i int) TABLESPACE fastspace;
    ```
    当结果显示为如下信息，则表示创建成功。
    ```
    CREATE TABLE
    ```
    
  
  - 方式2：先使用set default_tablespace设置默认表空间，再创建表。
    ```
    gaussdb=# SET default_tablespace = 'fastspace';
    SET
    gaussdb=# CREATE TABLE foo2(i int);
    CREATE TABLE
    ```
    假设设置"fastspace"为默认表空间，然后创建表foo2。
    
   
- 查询表空间
  - 方式1：检查pg_tablespace系统表。如下命令可查到系统和用户定义的全部表空间。
    ```
    gaussdb=# SELECT spcname FROM pg_tablespace;
    ```
    
  
  - 方式2：使用gsql程序的元命令查询表空间。
    ```
    gaussdb=# \db
    ```
    
   
- 查询表空间使用率
  1. 查询表空间的当前使用情况。
     ```
     gaussdb=# SELECT PG_TABLESPACE_SIZE('example');
     ```
     返回如下信息：
     ```
     pg_tablespace_size 
     --------------------
                 2146304
     (1 row)
     ```
     其中2146304表示表空间的大小，单位为字节。
     
  
  2. 计算表空间使用率。 表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小。
     
   
- 修改表空间命名
  执行如下命令对表空间fastspace重命名为fspace。
  ```
  gaussdb=# ALTER TABLESPACE fastspace RENAME TO fspace;
  ALTER TABLESPACE
  ```
  
- 删除表空间
  - 执行如下命令删除用户jack。
    ```
    gaussdb=# DROP USER jack CASCADE;
    DROP ROLE
    ```
    
  
  - 执行如下命令删除表foo和foo2。
    ```
    gaussdb=# DROP TABLE foo;
    gaussdb=# DROP TABLE foo2;
    ```
    当结果显示为如下信息，则表示删除成功。
    ```
    DROP TABLE
    ```
    
  
  - 执行如下命令删除表空间fspace。
    ```
    gaussdb=# DROP TABLESPACE fspace;
    DROP TABLESPACE
    ```
    ![](https://support.huaweicloud.com/centralized-devg-v3-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
    用户必须是表空间的owner或者系统管理员才能删除表空间。
    
   
 
