表空间目录

存储表空间数据的目录。

顾名思义,表空间目录 是与特定 表空间 相关联的文件系统目录,所有与该表空间相关的数据都存储在此目录中。

在执行 CREATE TABLESPACE 时会指定 表空间目录,例如:

CREATE TABLESPACE foo LOCATION '/tmp/tblspc_test'

先决条件

表空间目录必须由运行 PostgreSQL 进程的系统用户拥有(仅有组写权限不足),并且不能被同一 PostgreSQL 版本中的另一个表空间使用。

请注意,表空间目录不需要是空的,并且可以包含来自其他 PostgreSQL 版本的表空间目录(当使用 pg_upgrade 升级 PostgreSQL 实例时可能会出现这种情况)。但是,不建议在表空间目录中存储任何文件或创建任何子目录。

结构

PostgreSQL 会在指定的表空间目录中创建一个子目录来存储实际的表空间数据。子目录的名称格式如下:

/tmp/tblspc_test/PG_14_202010291

14”代表 PostgreSQL 主版本号,而“202010291”代表 目录版本号(而不是例如创建表空间的日期)。

最初,这个子目录不包含任何数据。

系统函数

可以使用 pg_tablespace_location() 函数检索表空间目录的文件系统路径。

注意事项和限制

无法使用 PostgreSQL 移动表空间目录(没有类似 ALTER TABLESPACE ... LOCATION ... 的命令);相反,必须在 PostgreSQL 停机期间手动移动表空间。

无法“分离”或“附加”表空间;包含表空间的每个目录在 PostgreSQL 运行时必须始终可进行读写操作。但是,可以将单个数据库对象在表空间之间移动。

示例

postgres=# CREATE TABLESPACE foo LOCATION '/tmp/tblspc_test';
CREATE TABLESPACE

$ ls -l /var/lib/pgsql/data/pg_tblspc/
total 0
lrwxrwxrwx 1 postgres postgres 16 Nov  6 14:38 16495 -> /tmp/tblspc_test

$ ls -l /tmp/tblspc_test/
total 4
drwx------ 2 postgres postgres 4096 Nov  6 14:38 PG_14_202010291

$ ls -l /tmp/tblspc_test/PG_14_202010291
total 0

postgres=# CREATE TABLE foo (id INT) TABLESPACE foo;
CREATE TABLE

$ find /tmp/tblspc_test/PG_14_202010291/
/tmp/tblspc_test/PG_14_202010291/
/tmp/tblspc_test/PG_14_202010291/12869
/tmp/tblspc_test/PG_14_202010291/12869/16452

分类

PostgreSQL 内部机制, 表空间

另请参阅

表空间, CREATE TABLESPACE, 数据目录

反馈

提交关于“表空间目录”的任何评论、建议或更正,请点击 此处