我们有一个在 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/