
# 表空间管理
#### 操作场景
RDS for PostgreSQL提供基于root用户的PostgreSQL表空间管理方案。支持以下两种表空间的管理方法。
- [系统预置表空间]，通过**control_tablespace**函数管理表空间。
- [用户自定义表空间]，通过标准SQL语句管理表空间。
 
 #### 系统预置表空间
1. 以**root** 用户连接数据库，并创建表空间。为了考虑数据库的性能，用户最多可创建100个表空间。
   
   ```
   # psql --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root -c "select control_tablespace ('create', '<TABLESPACE_NAME>');"
   ```
   表1参数说明 
   | 参数                | 说明           |
   |:---|:---|
   | *RDS_ADDRESS*     | RDS实例的IP地址。  |
   | *DB_PORT*         | RDS数据库实例的端口。 |
   | *DB_NAME*         | 数据库名称。       |
   | *TABLESPACE_NAME* | 表空间名称。       |
      
   示例如下，登录至数据库"my_db"并创建表空间"tbspc1"。
   ```
   # psql --host=192.168.6.141 --port=5432 --dbname=my_db --username=root -c "select control_tablespace('create', 'tbspc1');"
   ```
   根据命令提示输入root用户密码。
   ```
   Password for user root:
             control_tablespace          
   ------------------------------    
   create tablespace tbspc1 successfully.   
   (1 row)
   ```
   如果创建不成功，详细信息请[查看该实例错误日志](https://support.huaweicloud.com/usermanual-rds-pg/rds_recent_log.html)。
   
   
2. 以**root** 用户连接数据库，并授权表空间使用权限给指定用户。
   
   ```
   # psql --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root -c "select control_tablespace ('alter', '<TABLESPACE_NAME>', '<USER_NAME>');"
   ```
   表2参数说明 
   | 参数                | 说明           |
   |:---|:---|
   | *RDS_ADDRESS*     | RDS实例的IP地址。  |
   | *DB_PORT*         | RDS数据库实例的端口。 |
   | *DB_NAME*         | 数据库名称。       |
   | *TABLESPACE_NAME* | 表空间名称。       |
   | *USER_NAME*       | 表空间的用户名。     |
      
   示例如下，登录至数据库"my_db"并授权表空间"tbspc1"的使用权限。
   ```
   # psql --host=192.168.6.141 --port=5432 --dbname=my_db --username=root -c "select control_tablespace('alter', 'tbspc1', 'user1');"
   ```
   根据提示输入root用户密码。
   ```
   Password for user root:
            control_tablespace         
   ----------------------------    
   alter tablespace tbspc1 successfully.   
   (1 row)
   ```
   如果授权不成功，详细信息请[查看该实例错误日志](https://support.huaweicloud.com/usermanual-rds-pg/rds_recent_log.html)。
   
   
3. 以**root** 用户连接数据库，并删除表空间。删除表空间之前请确认该表空间已为空。
   
   ```
   # psql --host=<RDS_ADDRESS> --port=<DB_PORT> --username=root --dbname=<DB_NAME> -c "select control_tablespace('drop', '<TABLESPACE_NAME>');"
   ```
   表3参数说明 
   | 参数                | 说明           |
   |:---|:---|
   | *RDS_ADDRESS*     | RDS实例的IP地址。  |
   | *DB_PORT*         | RDS数据库实例的端口。 |
   | *DB_NAME*         | 数据库名称。       |
   | *TABLESPACE_NAME* | 表空间名称。       |
      
   示例如下：
   ```
   # psql --host=192.168.6.141 --port=8635 --dbname=my_db --username=root -c "select control_tablespace('drop', 'tbspc1');"
   ```
   根据提示输入root用户密码。
   ```
   Password for user root:
            control_tablespace         
   ----------------------------    
   drop tablespace tbspc1 successfully.   
   (1 row)
   ```
   如果删除不成功，详细信息请[查看该实例错误日志](https://support.huaweicloud.com/usermanual-rds-pg/rds_recent_log.html)。
   
   
 
 #### 用户自定义表空间
RDS for PostgreSQL将目录"/var/lib/pgsql/selfspc/tbls"作为root用户自定义表空间的基目录，用户可以基于这个目录使用标准SQL语句管理表空间。
1. 以**root** 用户连接数据库。
   
   ```
   # psql --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root
   ```
   表4参数说明 
   | 参数            | 说明           |
   |:---|:---|
   | *RDS_ADDRESS* | RDS实例的IP地址。  |
   | *DB_PORT*     | RDS数据库实例的端口。 |
   | *DB_NAME*     | 数据库名称。       |
      
   示例如下，登录至数据库"my_db"，并根据提示输入root用户密码。
   ```
   # psql --host=192.168.6.141 --port=5432 --dbname=my_db
   ```
   
   
2. 创建表空间。 
   ```
   CREATE TABLESPACE <TABLESPACE_NAME> LOCATION '<TABLESPACE_LOCATION>';
   ```
   表5参数说明 
   | 参数                    | 说明                                                                                          |
   |:---|:---|
   | *TABLESPACE_NAME*     | 表空间名称。                                                                                      |
   | *TABLESPACE_LOCATION* | 表空间的存储路径。该参数值必须以/开头，仅支持数字、字母以及特殊字符. / - _ 实际的表空间路径为与基目录拼接后的路径。 |
      
   示例如下，创建表空间"user_tbspc"，路径为/var/lib/pgsql/selfspc/tbls/data。
   ```
   CREATE TABLESPACE user_tbspc LOCATION '/data';
   ```
   
   
3. 查看表空间。 
   ```
   SELECT spcname, pg_tablespace_location(oid) FROM pg_tablespace;
   ```
   
   
4. 使用表空间。 
   ```
   CREATE TABLE users (
       id SERIAL PRIMARY KEY,
       name VARCHAR(50)
   ) TABLESPACE user_tbspc;
   ```
   
   
5. 删除表空间。 
   ```
   DROP TABLESPACE if exists user_tbspc;
   ```
   
   
 
