PostgreSQL逻辑结构管理:表空间

610 阅读2分钟

什么是表空间

表空间允许将不同的表放到不同的存储介质或文件系统下,在PostgreSQL中表空间实际上就是给表指定一个存储目录。

表空间的作用

能合理利用磁盘的空间和性能,能制定最优的物理存储方式来管理表和索引。例如某个分区磁盘空间不足,那么就可以创建一个表空间到另一个分区上;另外,可以将经常使用的表或者索引放在性能好的磁盘上,将不经常使用的表和索引放在性能较弱的磁盘上。

查看表空间

连接数据库使用\db可以查看数据库具有哪些表空间

postgres=# \db
             List of tablespaces
    Name    |  Owner   |      Location
------------+----------+---------------------
 pg_default | postgres |
 pg_global  | postgres |
 tbs        | postgres | /opt/pgsql/bin/tbs
 tbs1       | postgres | /opt/pgsql/bin/tbs1
(4 rows)

--pg_default:系统表空间,存储系统目录对象,用户表、用户表index、和临时表、临时表index、
--内部临时表的默认空间。对应存储目录$PADATA/base/
--pg_global:系统表空间,存放系统字典表;对应存储目录$PADATA/global/

创建表空间

创建表空间语法:

Command:     CREATE TABLESPACE
Description: define a new tablespace
Syntax:
CREATE TABLESPACE tablespace_name
    [ OWNER { new_owner | CURRENT_USER | SESSION_USER } ]
    LOCATION 'directory'
    [ WITH ( tablespace_option = value [, ... ] ) ]

创建表空间,并在创建表时指定表空间:

postgres=# create tablespace test_tbs  owner postgres location '/tmp/tbs';
CREATE TABLESPACE
postgres=# create table test1(a int) tablespace test_tbs;
CREATE TABLE
postgres=# \d test1
               Table "public.test1"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 a      | integer |           |          |
Tablespace: "test_tbs"

创建数据库时指定表空间,之后在此数据库中创建表、索引等会自动存储到表空间目录:

postgres=# create database test1 tablespace test_tbs;
CREATE DATABASE

更改表空间

--更改database表空间
postgres=# alter database test1 set tablespace tbs;
ALTER DATABASE

--更改表的表空间
postgres=# alter table test1 set tablespace tbs;
ALTER TABLE

注意:执行更改数据库表空间操作时,不能有用户连接到该数据库;改变数据库的默认表空间时,数据库中已有表的表空间不会改变;修改表的表空间时会锁表,对表的所有操作都无法执行。

删除表空间

postgres=# \h drop tablespace
Command:     DROP TABLESPACE
Description: remove a tablespace
Syntax:
DROP TABLESPACE [ IF EXISTS ] name

--删除表空间,若表空间不为空,删除失败
postgres=# drop tablespace tbs;
ERROR:  tablespace "tbs" is not empty

注: Oracle数据库中,一个表空间只属于一个数据库;一个数据库可以拥有多个表空间。属于"一对多"的关系。而在PostgreSQL集群中,一个表空间可以让多个数据库使用;一个数据库可以使用多个表空间。属于"多对多"的关系.在对PostgreSQL进行逻辑备份时,要备份表空间需要使用pg_dumpall