代码改变世界

PostgreSQL 的表空间

  abce  阅读(46)  评论(0编辑  收藏  举报

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

 

通过使用表空间,管理员可以控制 PostgreSQL 的磁盘布局。这至少在以下两个方面很有用。首先,如果初始化群集的分区或卷空间耗尽且无法扩展,可在不同的分区上创建表空间。其次,表空间允许管理员利用数据库对象使用模式的知识来优化性能。例如,使用率非常高的索引可以放在速度非常快、可用性非常高的磁盘上,如固态设备。与此同时,存储很少使用或性能不重要的存档数据的表可以存储在价格较低、速度较慢的磁盘系统上。

 

即使表空间位于 PostgreSQL 主数据目录之外,它们也是数据库群集不可分割的一部分,不能被视为独立的数据文件集合。它们依赖于主数据目录中包含的元数据,因此不能附加到不同的数据库群集或单独备份。同样,如果丢失表空间(文件删除、磁盘故障等),数据库群集可能会变得不可读或无法启动。

 

定义表空间

使用create tablespace 语句定义表空间,比如:

1
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';

该位置必须是 PostgreSQL 操作系统用户拥有的现有空目录。随后在表空间内创建的所有对象都将存储在该目录下的文件中。

 

创建表格空间本身必须以数据库超级用户身份进行,但之后可以允许普通数据库用户使用它。要做到这一点,需要授予他们 CREATE 权限。

 

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

1
CREATE TABLE foo(i int) TABLESPACE space1;

或者,使用 default_tablespace 参数:

1
2
SET default_tablespace = space1;
CREATE TABLE foo(i int);

还有一个 temp_tablespaces 参数,用于确定临时表和索引的位置,以及用于排序大型数据集等目的的临时文件的位置。该参数可以是一个表空间名称列表,而不是只有一个,这样与临时对象相关的负载就可以分散到多个表空间中。每次创建临时对象时,都会从列表中随机抽取一个成员。

 

temp_tablespaces、default_tablespace默认都是空。

1
2
3
4
5
6
7
8
9
10
11
12
13
postgres=# show temp_tablespaces;
 temp_tablespaces
------------------
  
(1 row)
 
postgres=# show default_tablespace;
 default_tablespace
--------------------
  
(1 row)
 
postgres=#

与数据库关联的表空间用于存储该数据库的系统目录。此外,如果没有给定 TABLESPACE 子句,也没有通过 default_tablespace 或 temp_tablespaces(视情况而定)指定其他选择,则该表空间是用于在数据库中创建的表、索引和临时文件的默认表空间。如果创建数据库时未为其指定表空间,则该数据库将使用与模板数据库相同的表空间。在使用表空间的所有数据库中的所有对象都被删除之前,不能删除表空间。

 

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

1
2
3
4
5
6
7
8
postgres=# select * from pg_tablespace;
 oid  |  spcname   | spcowner | spcacl | spcoptions
------+------------+----------+--------+------------
 1663 | pg_default |       10 |        |
 1664 | pg_global  |       10 |        |
(2 rows)
 
postgres=#

在集群内只有一个pg_tablespac表,集群中的数据库之间共享该表。

·pg_default 位于 PGDATA/base 目录中;除非明确选择了另一个表空间,否则它会被用作默认表空间。

·pg_global 位于 PGDATA/global 目录中;它存储着整个集簇公共的系统目录对象。

 

要删除空表空间,请使用 DROP TABLESPACE 命令。要确定现有表空间的集合,请检查 pg_tablespace。

 

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

1
2
3
4
5
6
7
8
9
postgres=# \db
       List of tablespaces
    Name    |  Owner   | Location
------------+----------+----------
 pg_default | postgres |
 pg_global  | postgres |
(2 rows)
 
postgres=#

 

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

相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示