暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL "in place" tablespaces

原创 多米爸比 2022-10-26
481

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乐知乐享交流群,欢迎关注我文章的小伙伴加我微信进群吹牛唠嗑,交流技术。

456.png

最后修改时间:2022-11-08 09:49:14
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论