PostgreSQL "in place" tablespaces

来源:这里教程网 时间:2026-03-14 21:21:04 作者:

PostgreSQL官网在发布15 Beta3时,同时也发布了10到14的补丁版本,包括14.5, 13.8, 12.12, 11.17, 10.22,文章链接如下:

https://www.postgresql.org/about/news/postgresql-145-138-1212-1117-1022-and-15-beta-3-released-2496/

注意到有一条表空间的功能支持

Add support for tablespaces that are plain directories instead of symbolic links to other directories.

该功能是通过 allow_in_place_tablespaces开关项参数控制,默认是关闭的,打开后表空间开启"in place"功能,数据直接存储在pg_tblspc目录里面。

通常新的功能参数都是在某个大版本里发布,allow_in_place_tablespaces参数比较有意思,在版本10到版本14里并不是都能使用,例如14.4, 13.7, 12.11, 11.16, 10.21就不行。

有了allow_in_place_tablespaces参数支持,我们在一些开发测试场景能比较方便的处理自定义表空间的问题,尤其是在同一台机器上。

例如当我们使用pg_basebackup做备份时,可能会遇到如下错误

$ pg_basebackup --pgdata=datarec
pg_basebackup: error: directory "/home/postgres/test_spc1" exists but is not empty
pg_basebackup: removing data directory "datarec"

基础备份拷贝PGDATA时也对pg_tblspc用户自定义表空间符号链接进行拷贝,同一台机器上会有冲突。

因此需要使用–tablespace-mapping选项来进行表空间目录映射:

$ pg_basebackup --pgdata=datarec \
--tablespace-mapping=/home/postgres/test_spc1=/home/postgres/test_spc2

多个用户自定义表空间需要多次使用–tablespace-mapping进行映射。

下面打开allow_in_place_tablespaces参数

postgres=# ALTER SYSTEM SET allow_in_place_tablespaces TO true;
ALTER SYSTEM
postgres=# SELECT pg_reload_conf();
 pg_reload_conf 
----------------
 t
(1 row)

然后创建表空间时location设置为空

postgres=# create tablespace myspace location '';
CREATE TABLESPACE

此时直接在pg_tblspc里面生成表空间文件目录来存储数据。

$ ls -l /opt/pgdata1405/pg_tblspc/
total 0
drwxr-x--- 3 postgres dba 29 Oct 26 12:02 623641

保持联系

本人组建了一个技术交流群:PG乐知乐享交流群。欢迎关注文章的小伙伴随缘加入,进群请加本人微信skypkmoon并备注PG乐知乐享。

相关推荐