陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235 / 19906632509 / 19906733890 / 19905812933(微信同号)

客服微信

【PostgreSQL】PG表空间介绍

作者:炎燚小寶
发布时间:2024-06-20 09:13
浏览量:430

注: 本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。


一、表空间概述

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

通过使用表空间,管理员可以控制 PostgreSQL 安装的磁盘布局。这至少在两个方面很有用。首先,如果初始化集群的分区或卷空间不足且无法扩展,则可以在不同的分区上创建表空间并使用它,直到可以重新配置系统为止。

其次,表空间允许管理员利用数据库对象使用模式的知识来优化性能。例如,可以将频繁使用的索引放置在非常快、高度可用的磁盘上,例如昂贵的固态设备。同时,存储很少使用或性能不关键的归档数据的表可以存储在较便宜、较慢的磁盘系统上。


注意:

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


二、表空间使用

要定义表空间,请使用 CREATE TABLESPACE 命令,例如:


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

通常,为每个逻辑文件系统创建多个表空间没有多大意义,因为您无法控制逻辑文件系统中单个文件的位置。然而,PostgreSQL 并不强制执行任何此类限制,而且实际上它并不直接了解系统上的文件系统边界。它只是将文件存储在您告诉它使用的目录中。

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

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


或者,使用 default_tablespace 参数:


当 default_tablespace 设置为空字符串以外的任何值时,它会为没有显式 TABLESPACE 子句的 CREATE TABLE 和 CREATE INDEX 命令提供隐式 TABLESPACE 子句。

还有一个 temp_tablespaces 参数,它确定临时表和索引以及用于对大型数据集进行排序等目的的临时文件的位置。这可以是表空间名称的列表,而不仅仅是一个,以便与临时对象相关的负载可以分布在多个表空间上。每次创建临时对象时都会从列表中随机选择一个成员。

与数据库关联的表空间用于存储该数据库的系统目录。此外,如果没有给出 TABLESPACE 子句并且 default_tablespace 或 temp_tablespaces 没有指定其他选择(视情况而定),则它是用于在数据库中创建的表、索引和临时文件的默认表空间。如果创建数据库时未为其指定表空间,则它将使用与从中复制的模板数据库相同的表空间。

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

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

要删除空表空间,请使用 DROP TABLESPACE 命令。

要确定现有表空间集,请检查 pg_tablespace 系统目录,例如


psql 程序的 db 元命令对于列出现有表空间也很有用。

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


三、表空间语法介绍

3.1 创建语法


3.2 描述

CREATE TABLESPACE 注册一个新的集群范围的表空间。表空间名称必须与数据库集群中任何现有表空间的名称不同。

表空间允许超级用户在文件系统上定义一个替代位置,其中包含数据库对象(例如表和索引)的数据文件可以驻留在其中。

具有适当权限的用户可以将 tablespace_name 传递给 CREATE DATABASE、CREATE TABLE、CREATE INDEX 或 ADD CONSTRAINT,以便将这些对象的数据文件存储在指定的表空间中。


3.3 参数介绍

tablespace_name

要创建的表空间的名称。该名称不能以 pg_ 开头,因为此类名称是为系统表空间保留的。


user_name

将拥有该表空间的用户的名称。如果省略,则默认为执行该命令的用户。只有超级用户才能创建表空间,但他们可以将表空间的所有权分配给非超级用户。


directory
将用于表空间的目录。该目录必须存在(CREATE TABLESPACE 不会创建它),应该为空,并且必须由 PostgreSQL 系统用户拥有。该目录必须由绝对路径名指定。


tablespace_option
要设置或重置的表空间参数。目前,唯一可用的参数是 seq_page_cost、random_page_cost、 effective_io_concurrency 和maintenance_io_concurrency。为特定表空间设置这些值将覆盖规划器对从该表空间中的表读取页面的成本的通常估计,以及执行器的预取行为,如由同名配置参数建立的(请参阅 seq_page_cost、random_page_cost、 effective_io_concurrency、maintenance_io_concurrency) )。如果一个表空间位于比 I/O 子系统的其余部分更快或更慢的磁盘上,这可能很有用。


3.4 注意

CREATE TABLESPACE 不能在事务块内执行。


3.5 示例

要在文件系统位置 /data/dbs 创建表空间 dbspace,首先使用操作系统工具创建目录并设置正确的所有权:


然后在 PostgreSQL 中发出表空间创建命令:


要创建由不同数据库用户拥有的表空间,请使用如下命令:




想了解更多PG相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。

想了解更多PG相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。

想了解更多PG相关的学习资料(技术文章和视频),可以微信公众号或B站搜索《云贝教育》,免费获取。


另外需要学习资料 的同学,可以添加联系方式:(同V) 陈老师 199-4146-4235 / 郑老师 199-0663-2509 / 蕾老师199-0663-5786,我们会持续更新学习视频。