我该如何调整 postgres 以避免此错误?

我该如何调整 postgres 以避免此错误?

我收到错误

错误:无法写入临时文件的块 3478284:设备上没有剩余空间

运行以下查询时:

INSERT INTO summary SELECT t1.a, t1.b, SUM(t1.p) AS p, COUNT(t1.*) AS c,
    t1.d, t1.r, DATE_TRUNC('month', t1.start) AS month, t2.t AS t, t2.h, t2.x
FROM raw1 t1, raw2 t2
WHERE t1.t2_id=t2.id AND (t2.t<>'a' OR t2.y) GROUP BY month, t, a, b, d, r, h, x

表 t1 非常大,表 t2 也相当大

Caused by: org.postgresql.util.PSQLException: ERROR: could not write block 3478284 of temporary file: No space left on device
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)

任何提示都值得赞赏。

答案1

Postgres 在尝试完成您的请求时,临时垃圾场中的空间不足——解决此问题的方法是运行一个更简单的查询(这可能没有帮助)或在保存的驱动器上释放更多空间(如果您有一段时间PGDATA/base/pgsql_tmp/ 没有这样做,现在可能是个好时机:-)VACUUM FULL

您也可以put pgsql_tmp在其自己的分区上进行操作(请注意权限,因为 Postgres 往往会对这些事情很挑剔)

请注意,我相信pgsql_tmp现在是每个表空间,所以如果这不是主(base)表空间适当替代:-)

答案2

在写入的磁盘上添加空间吗?

答案3

我知道这个线程有点旧了,但我认为这可以帮助某些人,因为我遇到了类似的问题并且没有选择扩展远程主机上的存储。

我设法解决该问题的另一种方法是运行脚本以分块选择记录并遍历记录,直到最后的结果不返回任何记录。例如,下面的方法应该适合您。

注意顺序,这非常重要,否则,您可能会选择已经被选择的记录并最终得到重复的记录(我遇到过这种情况)。

INSERT INTO summary SELECT t1.a, t1.b, SUM(t1.p) AS p, COUNT(t1.*) AS c,
    t1.d, t1.r, DATE_TRUNC('month', t1.start) AS month, t2.t AS t, t2.h, t2.x
FROM raw1 t1, raw2 t2
WHERE t1.t2_id=t2.id AND (t2.t<>'a' OR t2.y) 
order by t1.a, t1.b
limit 100 offset 0
GROUP BY month, t, a, b, d, r, h, x

在下次运行执行中,将偏移量调整为 100,依此类推。

希望它能对某人有所帮助。:)

答案4

我敢打赌,postgres 使用 /tmp 作为临时存储,而您的根分区比系统中的分区小。如果您将 postgres 临时存储更改为有更多空间的地方,则可以解决此问题。或者如上文所述,添加更多空间。要确认这是在 /tmp 中写入,请查看配置文件或在运行查询时反复运行 ls -lart /tmp,如果文件在增长,那么这就是写入的位置。我不是 postgres 用户,但在大多数情况下,您应该能够根据我上面所说的内容弄清楚。

相关内容