PostgreSQL之表空间

1、什么是PG中的表空间(tablespace)?

pg中的表空间实际上就是文件系统中的一个目录, 是pg中数据库对象(包括表、索引等)的容器。

Pg使用操作系统的文件系统进行对象存储,每个数据库对象都有自己的数据文件,如果对象很大,它将会被分为多个文件,单个文件大小的上限是1GB。表空间就是包含这些数据文件的目录。

简而言之,表空间是告诉PG服务器将数据库对象的物理文件放在哪里。

2、表空间的分类?

默认表空间:pg_default ,是用户表、用户表index、和临时表、临时表index、内部临时表的默认空间。对应文件系统目录$PADATA/base/。

系统字典表表空间:pg_global,存放系统字典表,如pg_database、pg_authid、pg_tablespace等表以及它们的索引。对应文件系统目录$PADATA/global/。

自定义表空间:用户创建的表空间。对应文件系统目录$PADATA/pg_tblspc/, 当手动创建表空间时,该目录下会自动生成一个软链接,指向表空间设定的路径。

其中pg_default和pg_global是在PG集群initdb之后默认创建的。

3、查看当前集群中所有的表空间?

PSQL使用"\db+"命令,可以详细列出表空间。

ios 分类的原理 pg分类_数据库

也可以使用sql查看所有表空间:

select oid,* from pg_tablespace;

4、表空间的创建和使用?

1)要创建表空间,首先创建一个新目录,注意该目录需要属于“postgres”操作系统用户。

2)使用sql创建表空间。

CREATE TABLESPACE mytbsp LOCATION '/tmp/mytbsp';

3)使用表空间。

大多数“create” SQL命令都带有一个“TABLESPACE”选项,我们可以使用这个选项指定SQL对象的表空间。

如:

在表空间mytbsp中创建一个名为testdb的数据库。注:此后该数据库中所有对象的默认表空间也成为mytbsp。

create database testdb tablespace mytbsp;

在mytbsp表空间中创建一个表newtab。

CREATE TABLE newtab (

   id  integer NOT NULL,

   val text    NOT NULL

) TABLESPACE mytbsp;

注意:索引并不会继承与表的表空间。

在mytbsp表空间中创建索引对象。

CREATE INDEX newtab_val_idx ON newtab (val)
   TABLESPACE mytbsp;

另外,ALTER命令可以更改任何对象的表空间。

更改newtab的表空间为pg_default。

alter table newtab set tablespace pg_default;

我们也可以将一个表空间中的所有表(或索引)都移动到另外一个表空间。

alter table all in tablespace mytbsp set tablespace pg_default;

注意:将对象移动到另一个表空间将复制数据文件,在这个期间涉及到的对象将被锁定,不可访问。

5、含有自定义表空间的集群的备份?

如果对包含表空间的数据库执行文件系统备份,则必须备份所有表空间。

使用普通格式的pg_basebackup将尝试将表空间保存在与数据库服务器上相同的位置(-D选项仅指定数据目录的位置)。要将数据从表空间备份到不同的位置,必须使用选项--tablespace-mapping=olddir=newdir。对于多个表空间,可以多次使用此选项。

pg_basebackup --format=p --tablespace-mapping=/tmp/mytbsp=/tmp/mytbsp2backup -D plainbackup

6、流复制场景下使用表空间?

流复制场景下表空间的使用稍微复杂点,因为新表空间的路径没有同步到备用服务器上。备用服务器上会期望在与主服务器相同的位置上有一个现有目录,并在该位置上创建一个表空间。

7、使用表空间的优点?



当存储分区没有空间时,可以使用表空间把数据存到其他分区。



利用表空间对数据库进行性能优化。如频繁使用的数据表或索引放在高性能的硬盘上,而较少使用的放在普通硬盘上。(注意,这时候需要调整表空间参数:seq_page_cost和random_page_cost



8、使用表空间的缺点?

使用表空间使数据库管理(比如备份和流复制)更加复杂,因为数据目录不再包含所有数据。

9、其他

临时表空间: 临时表和索引是由PostgreSQL在显式请求(“CREATE TEMP TABLE..”)或需要临时保存大数据集以完成查询时创建的。可以告诉PG将这些对象放在单独的表空间中。例如,如果在正常过程中创建了太多临时表,那么可以通过将这些对象放在具有更快、更大、未压缩文件系统甚至内存文件系统的表空间中来加快查询速度。使用选项temp_tablespaces告诉Postgres使用哪个表空间创建临时表。