Google Cloud 本地 SSD 可以用于 PostgreSQL 临时表空间吗?

rot*_*ten 3 postgresql google-compute-engine google-cloud-platform

我们有一个 PostgreSQL 实例在 Google Cloud 的虚拟机中运行。我们运行的查询的性质涉及大量 PostgreSQL 临时表空间。(每天5 或 6 TB或更多TB的磁盘 I/O)

此 I/O 仍然是我们数据库中的主要瓶颈。目前,这一切都发生在 SSD 永久磁盘上——不是因为我们需要在重启时保存任何数据,而是因为 PostgreSQL 在磁盘上布置了一个文件结构,然后它用于临时表,如果数据库启动时文件结构丢失,不太好。

我想做的是在本地 SSD 上配置临时表空间,因为它们的 I/O 吞吐量要高得多。不幸的是,它们在每次重新启动时都会消失。我想要一种简单的方法,能够在重新启动后和 PostgreSQL 开始备份之前重新布局磁盘。

我可以解压缩空文件结构,然后编写一个脚本,在每次启动后解压缩它。那有意义吗?有没有更好的方法/最佳实践来做到这一点?

如果有一个 PostgreSQL 扩展可以神奇地做到这一点,那就太棒了。

想法?

Jos*_*Mac 5

我深入研究了我以前的测试,这里有一些总结:

PostgreSQL 表空间只是一个目录 - 没什么大不了的。另外 - 如果您仅将其用作临时表空间,则关闭数据库时将不会留下任何持久文件。

您可以在您想要的任何位置为临时表创建表空间,然后转到此位置并检查目录结构以查看 PG 创建的内容。但是你必须在 OS 下做,因为 PG 只会向你显示表空间主目录 - psql 中的 \db+ 或select oid, spcname, pg_tablespace_location(oid) from pg_tablespace;以相同的方式工作。

我的例子:

  • (我使用 /tempspace/pgtemp 作为假定的安装点)CREATE TABLESPACE p_temp OWNER xxxxxx LOCATION '/tempspace/pgtemp';在我的案例结构中创建/tempspace/pgtemp/PG_10_201707211
  • temp_tablespaces = 'pg_temp'在 postgresql.conf 中设置并重新加载了配置。
  • 当我使用create temp table ....PG 添加另一个子目录时 - /tempspace/pgtemp/PG_10_201707211/16393= 模式的 oid - 但这对临时表空间无关紧要,因为如果缺少该子目录,PG 将创建它。
  • PG 在此 subdir 文件中为临时表创建。
  • 当我关闭这个临时表的会话文件时,它就消失了。

现在我停止了 PG 并测试了如果目录丢失会发生什么:

  • 我删除PG_10_201707211了它的子目录
  • 启动 PG 和日志显示消息LOG: could not open tablespace directory "pg_tblspc/166827/PG_10_201707211": No such file or directory但 PG 启动
  • 我尝试创建临时表 - 我收到错误消息 ERROR: could not create directory "pg_tblspc/166827/PG_10_201707211/16393": No such file or directory SQL state: 58P01
  • 现在(运行 PG)我在 OS 中发出了这些命令:
    • 须藤 mkdir -p /tempspace/pgtemp/PG_10_201707211
    • 须藤 chown postgres:postgres -R /tempspace/pgtemp
    • 须藤 chmod 700 -R /tempspace/pgtemp
  • 我尝试再次创建临时表并插入和选择值,一切正常

所以结论是 - 由于 PG 表空间不是“大魔法”只是目录,您可以简单地创建在 linux 启动时运行的 bash 脚本,该脚本将检查(并在必要时挂载)本地 SSD 并为 PG 临时表空间创建必要的目录。