什么是表空间
表空间允许将不同的表放到不同的存储介质或文件系统下,在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