PostgreSQL的表空间

こ雲淡風輕ζ 提交于 2019-11-28 02:43:13

PostgreSQL中的表空间允许数据库管理员在文件系统中定义可以存储表示数据库对象的文件的位置。创建后,可以在创建数据库对象时按名称引用表空间。

通过使用表空间,管理员可以控制PostgreSQL安装的磁盘布局。这至少在两个方面很有用。首先,如果初始化集群的分区或卷空间不足并且无法扩展,则可以在不同的分区上创建表空间并使用,直到可以重新配置系统。其次,表空间允许管理员使用数据库对象的使用模式的知识来优化性能。例如,非常频繁使用的索引可以放置在非常快速,高度可用的磁盘上,如昂贵的固态设备。同时,存储很少使用或不具有性能关键的存档数据的表可以存储在较便宜,较慢的磁盘系统上。

即使位于PostgreSQL主数据目录之外,表空间也是数据库集群的组成部分,不能被视为数据文件的自治集合。它们依赖于主数据目录中包含的元数据,因此无法附加到其他数据库集群或单独备份。同样,如果丢失表空间(文件删除,磁盘故障等),数据库群集可能会变得不可读或无法启动。将表空间放在像RAM磁盘这样的临时文件系统上会降低整个集群的可靠性。

 

创建一个表空间:

postgres=# create tablespace pgtbl_test location '/pgtest';

该位置必须是PostgreSQL操作系统用户拥有的现有空目录。随后在表空间中创建的所有对象都将存储在此目录下的文件中。该位置不能位于可移动或临时存储上,因为如果表空间丢失或丢失,群集可能无法运行。

必须以数据库超级用户身份创建表空间本身,但之后您可以允许普通数据库用户使用它。为此,请为其授予CREATE权限。

 

可以将表,索引和整个数据库分配给特定的表空间。为此,具有给定表空间的CREATE特权的用户必须将表空间名称作为参数传递给相关命令。例如,以下内容在表空间中创建一个表:

postgres=# create table foo(i int) tablespace pgtbl_test;

  

也可以将创建的表空间设置为默认表空间:

set default_tablespace = pgtbl_test;
create table foo(i int);

  

初始化数据库集群时会自动创建两个表空间。pg_global表空间用于共享系统目录。pg_default表空间是template1和template0数据库的缺省表空间(因此,它也将是其他数据库的缺省表空间,除非被CREATE DATABASE中的TABLESPACE子句覆盖)。

1.pg_default和pg_global表空间是在initdb()时候创建的
2.如果没有显式指定表空间,默认存储在pg_default表空间中
3.数据库集群级别管理的表被存放在pg_global表空间中
4.pg_default表空间物理位置是$PGDATA/base
5.pg_global表空间物理位置是$PGDATA/global
6.一个表空间可以被多个数据库公用
7.用户创建的表空间在$PGDATA/tblspc目录中会创建对应的符号链接 
 

创建后,只要请求用户具有足够的权限,就可以从任何数据库使用表空间。这意味着在删除使用表空间的所有数据库中的所有对象之前,不能删除表空间。

 

查看已有的表空间:

postgres=# select * from pg_tablespace;
  spcname   | spcowner | spcacl | spcoptions 
------------+----------+--------+------------
 pg_default |       10 |        | 
 pg_global  |       10 |        | 
 myspc      |       10 |        | 
 pgtbl_test |       10 |        | 
(4 rows)

postgres=# \db
               List of tablespaces
    Name    |  Owner   |        Location         
------------+----------+-------------------------
 myspc      | postgres | /data/pgdata/10/test_ts
 pg_default | postgres | 
 pg_global  | postgres | 
 pgtbl_test | postgres | /pgtest
(4 rows)

postgres=# 

  

删除空的表空间:

postgres=# drop tablespace pgtbl_test;

  

目录$PGDATA/pg_tblspc包含指向集群中定义的每个非内置表空间的符号链接。 虽然不推荐,但可以通过重新定义这些链接来手动调整表空间布局。在任何情况下都不要在服务器运行时执行此操作。
请注意,在PostgreSQL 9.1及更早版本中,还需要使用新位置更新pg_tablespace目录。(如果不这样做,pg_dump将继续输出旧的表空间位置。)

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!