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
保持联系
从2019年12月开始写第一篇文章,分享的初心一直在坚持,本人现在组建了一个PG乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。