我收到错误
错误:无法写入临时文件的块 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)
任何提示表示赞赏。
Postgres 在尝试完成您的请求时,其临时转储场的空间不足 - 解决此问题的方法是运行更简单的查询(这可能没有帮助)或释放驱动器上的更多空间
PGDATA/base/pgsql_tmp/
(如果你有一段时间没做过VACUUM FULL
可能是个好时机:-)你也可以
put pgsql_tmp
在它自己的分区上(注意权限,因为 Postgres 往往对这些事情很敏感)在它写入的磁盘上添加空间?
我知道这个线程有点旧,但我认为这可以帮助某人,因为我遇到了类似的问题并且没有选择扩展远程主机上的存储。
我设法解决它的另一种方法是运行脚本以分块选择记录并遍历记录,直到最后一个结果不返回任何记录。例如,像下面这样的东西应该适合你。
请注意顺序,这非常重要,否则,您可能会选择已被选择的记录并最终出现重复(我有过)。
在下一次运行执行中,您将偏移量调整为 100,依此类推。
希望它可以帮助某人。:)
我敢打赌,postgres 使用 /tmp 进行临时存储,并且您的根分区小于系统中的分区。如果您将 postgres 临时存储更改为您有更多空间的地方,您可以解决此问题。或者正如上面的帖子所说,添加更多空间。要确认这是在 /tmp 中写入,请查看配置文件或在运行查询时一遍又一遍地运行 ls -lart /tmp,如果文件正在增长,那么这就是它正在写入的位置。我不是 postgres 用户,但在大多数情况下,您应该能够通过我上面所说的来弄清楚。