postgresql - Google Cloud Local SSD 可以用于 PostgreSQL 临时表空间吗?

标签 postgresql google-cloud-platform google-compute-engine

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

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

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

我可以对空文件结构进行压缩,然后编写一个脚本在每次启动后对其进行解压缩。那有意义吗?是否有更好的方法/最佳实践来执行此操作?

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

想法?

最佳答案

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

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

您可以在任何您想要的位置为临时表创建表空间,然后转到该位置并检查目录结构以查看 PG 创建了什么。但是你必须在操作系统下做,因为 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
  • 我在 postgresql.conf 中设置了 temp_tablespaces = 'pg_temp' 并重新加载了配置。
  • 当我使用 create temp table .... PG 添加了另一个子目录 - /tempspace/pgtemp/PG_10_201707211/16393 = oid of schema - 但这并不重要对于临时表空间,因为如果这个子目录将丢失,PG 将创建它。
  • 在此子目录文件中为临时表创建 PG。
  • 当我关闭此 session 时,临时表的文件已经消失。

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

  • 我删除了 PG_10_201707211 及其子目录
  • 启动 PG,日志显示消息 LOG:无法打开表空间目录“pg_tblspc/166827/PG_10_201707211”:没有这样的文件或目录,但 PG 已启动
  • 我尝试创建临时表 - 我收到错误消息 错误:无法创建目录“pg_tblspc/166827/PG_10_201707211/16393”:没有这样的文件或目录 SQL 状态:58P01
  • 现在(运行 PG)我在操作系统中发出了这些命令:
    • sudo mkdir -p/tempspace/pgtemp/PG_10_201707211
    • sudo chown postgres:postgres -R/tempspace/pgtemp
    • sudo chmod 700 -R/tempspace/pgtemp
  • 我尝试再次创建临时表并插入和选择值,一切正常

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

关于postgresql - Google Cloud Local SSD 可以用于 PostgreSQL 临时表空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48152257/

相关文章:

mysql - Google CloudSQL 第二代创建功能不起作用

mysql - 如何在没有 MariaDB 的情况下仅在 Debian GNU/Linux 9 (stretch) 上安装 MySQL?

django - 从具有不同数量值的列表中进行查询

postgresql - PostgreSQL 12 可以在执行时使用子查询返回列表进行分区修剪吗?

java - 使用 java 中的\i 命令在 postgres 中导入 .sql 文件

google-compute-engine - 如何将我的 kubectl 设置重置回默认值

google-cloud-platform - terraform GCE 服务帐户节

postgresql - PostgreSQL 中的大小写不敏感

google-cloud-platform - Cloud PubSub 重复消息触发的 Cloud Functions

kubernetes - 在 Monorepo 中使用许多包构建条件云