postgres(时序库)附加新的表空间

1. 表空间介绍

表空间即PostgreSQL存储数据文件的位置,其中包括数据库对象。如,索引、表等。
PostgreSQL使用表空间映射逻辑名称和磁盘物理位置。默认提供了两个表空间:

pg_default 表空间存储用户数据
pg_global 表空间存储全局数据

利用表空间可以控制PostgreSQL的磁盘布局,它有两方面的优势:

首先,如果集群中的某个分区超出初始空间,可以在另一个分区上创建新的表空间并使用。后期可以重新配置系统。

其次,可以使用统计优化数据库性能。举例,可以把频繁访问的索引或表放在高性能的磁盘上,如固态硬盘;把归档数据放在较慢的设备上。

2.创建表空间

使用CREATE TABLESPACE语句创建表空间,语法如下:

CREATE TABLESPACE tablespace_name
OWNER user_name
LOCATION directory_path;

表空间名称不能以pg开头,因为这些名称为系统表空间保留。默认执行CREATE TABLESPACE语句的用户是表空间的拥有者。如果需要给其他用户赋权,可以值后面指定owner关键词。

directory_path是表空间使用空目录的绝对路径,PostgreSQL的用户必须拥有该目录的权限可以进行读写操作。

一旦创建好表空间,可以在CREATE DATABASE, CREATE TABLE 和 CREATE INDEX 语句中使用。

3.示例

连接数据库,使用\db+命令查看详细的默认表空间信息。

postgres=# \db+
                                  List of tablespaces
    Name    |  Owner   | Location | Access privileges | Options |  Size  | Description 
------------+----------+----------+-------------------+---------+--------+-------------
 pg_default | postgres |          |                   |         | 30 MB  | 
 pg_global  | postgres |          |                   |         | 574 kB | 
(2 rows)

创建表空间:(先确保这个目录存在,若果不存在自行去root登录后创建该目录,或者另指定存在的目录)

postgres=# create tablespace "sensor_tablespace" location '/data/postgresData';
CREATE TABLESPACE

ERROR: could not set permissions on directory "/data/postgresData": Operation not permitted
报错信息表明没有权限创建,应当登录root去修改一下这个目录归属权限给postgres用户后再去创建
chown -R postgres /data/postgresData/

此时再查看表空间信息

postgres=# \db+
                                           List of tablespaces
       Name        |  Owner   |      Location      | Access privileges | Options |  Size   | Description 
-------------------+----------+--------------------+-------------------+---------+---------+-------------
 pg_default        | postgres |                    |                   |         | 30 MB   | 
 pg_global         | postgres |                    |                   |         | 574 kB  | 
 sensor_tablespace | postgres | /data/postgresData |                   |         | 0 bytes | 
(3 rows)

4、timescaledb附加表空间

为超表tb_sensor_data附加表空间

SELECT attach_tablespace('sensor_tablespace', 'tb_sensor_data', if_not_attached => true);

如果需要将表空间分离出表空间,可使用以下命令

//分离某表某空间
SELECT detach_tablespace('tableSpaceName', 'hyperTableName');   
//分离某表某空间且当空间附加关系存在
SELECT detach_tablespace('tableSpaceName', 'hyperTableName', if_attached => true);    
 //分离某空间,不论与几个表有附加关系
SELECT detach_tablespace('tableSpaceName');   
//分离某表所有空间
SELECT detach_tablespace('hyperTableName');      
  • 如果一张超表有多个表空间,暂时不知道是以什么策略分配(官方文档未给出)
  • 如果一张超表附加了新的表空间,并且分离出默认表空间,并不会影响查询,并且只有在下一个chunk才会落在新的表空间。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容