postgreSQL不使用temp_tablespace

Chr*_*ris 1 postgresql

我目前在运行某些查询时遇到空间问题,postgreSQL用尽了临时空间。查询会生成几GB的列表(它们已经是碎片)

目前,我想通过将temp_tablespace移动到另一个文件夹来解决此问题,然后再移动整个数据库。

等/ postgresql.conf

temp_tablespaces = '/var/lib/postgresql/9.2/importdb02/tmp_consDB'
Run Code Online (Sandbox Code Playgroud)

/var/lib/postgresql/9.2/importdb02/

drwxr-xr-x  2 postgres postgres 4096 May 22 12:08 tmp_consDB
Run Code Online (Sandbox Code Playgroud)

postgresql:postgresql是该文件夹的所有者,我重新启动了该文件,但postgreSQL仍未使用此表空间进行查询。

当我运行查询并通过DF监视可用空间时,它仍在使用那些临时表的主表空间,我还可以看到/var/lib/.../base/pgsql_tmp文件夹在增加,而temp_tablespace文件夹保持空着。

所有查询看起来像这样

COPY(
SELECT  column_a,
        column_b,
        (around 8 group by columns)
        sum(tosumup),
        sum(tosumup)
        (up to 100 sum columns)
FROM    master_table
WHERE   id>=25000 AND id<50000 (running in batches)
GROUP BY
        group by colums
) TO stdout WITH DELIMITER ';' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

我的替代解决方案是将/ base / pg_tmp链接到另一个驱动器,但这就是黑客的版本。


我是在Clodoaldo Neto的回答后这样做的

作为postgres

CREATE TABLESPACE tempimpdb02 LOCATION '/var/lib/postgresql/9.2/importdb02/tmp_consDB';
Run Code Online (Sandbox Code Playgroud)

/ var /等

temp_tablespaces = 'tempimpdb02'
Run Code Online (Sandbox Code Playgroud)

重新启动,检查一切

postgres=# SELECT * FROM pg_tablespace;
   spcname   | spcowner | spcacl | spcoptions 
-------------+----------+--------+------------
 pg_default  |       10 |        | 
 pg_global   |       10 |        | 
 tempimpdb02 |       10 |        | 
(3 rows)


postgres=# show temp_tablespaces;
 temp_tablespaces 
------------------
 tempimpdb02
(1 row)
Run Code Online (Sandbox Code Playgroud)

现在在/var/lib/postgresql/9.2/importdb02/tmp_consDB(PG_9.2 ....)中有一个文件夹。

但是查询仍然使用/ base / psql_temp来获取临时数据,并且'tempimpdb02'中的文件夹为空。

Clo*_*eto 5

传递给的值temp_tablespaces是表空间名称的列表。一个表空间必须先创建为超级用户:

CREATE TABLESPACE tempimpdb02 LOCATION '/var/lib/postgresql/9.2/importdb02/tmp_consDB';
Run Code Online (Sandbox Code Playgroud)

现在在该表空间中创建一个表:

create table t tablespace tempimpdb02 as 
    SELECT  column_a,
            column_b,
            (around 8 group by columns)
            sum(tosumup),
            sum(tosumup)
            (up to 100 sum columns)
    FROM    master_table
    WHERE   id>=25000 AND id<50000 (running in batches)
    GROUP BY group by colums
Run Code Online (Sandbox Code Playgroud)

在该表空间中必须具有创建特权。

  • 当您说它需要创建特权的那一刻,我就知道了。我在TABLESPACE tempimpdb02上向用户做了所有授予;现在使用表空间,非常感谢。(顺便说一句,还有一种格式化注释的方法,虽然我认为我解决了该网站的一半问题,但我从来不需要发布问题) (3认同)