Wie kann ich Postgres einstellen, um diesen Fehler zu vermeiden?

7

Ich bekomme den Fehler

FEHLER: Block 3478284 der temporären Datei konnte nicht geschrieben werden: Kein Speicherplatz mehr auf dem Gerät

beim Ausführen der folgenden Abfrage:

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

Tabelle t1 ist sehr groß und Tabelle t2 ist ziemlich groß

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)

Hinweise geschätzt.

pstanton
quelle

Antworten:

9

Postgres hat nicht genügend Speicherplatz auf dem temporären Speicherplatz, während versucht wird, Ihre Anforderung abzuschließen. Sie können dies beheben, indem Sie entweder eine einfachere Abfrage ausführen (was wahrscheinlich nicht hilfreich ist) oder mehr Speicherplatz auf dem Laufwerk freigeben, das sich befindet PGDATA/base/pgsql_tmp/ (Wenn du schon VACUUM FULLeine Weile nicht mehr gemacht hast, ist das vielleicht eine gute Zeit :-)

Sie können auch put pgsql_tmpauf einer eigenen Partition arbeiten (beachten Sie die Berechtigungen, da Postgres dazu neigt, über diese Dinge auf dem Laufenden zu bleiben).

Beachten Sie, dass ich glaube pgsql_tmp, dass dies heutzutage pro Tabellenbereich ist. Wenn dies also nicht der baseErsatz für den main ( ) - Tabellenbereich ist, ist dies angemessen :-)

voretaq7
quelle
2

Speicherplatz auf der Festplatte hinzufügen, auf die geschrieben wird?

Bill Weiss
quelle
2

Ich weiß, dass dieser Thread etwas alt ist, dachte aber, dass dies jemandem helfen könnte, da ich ein ähnliches Problem hatte und keine Möglichkeit hatte, den Speicher auf dem Remote-Host zu erweitern.

Eine andere Möglichkeit, das Problem zu beheben, bestand darin, ein Skript auszuführen, um Datensätze in Blöcken auszuwählen und die Datensätze zu durchlaufen, bis das letzte Ergebnis keine Datensätze mehr zurückgibt. Zum Beispiel sollte so etwas wie das Folgende für Sie funktionieren.

Beachten Sie die Reihenfolge nach, dies ist sehr wichtig, oder Sie wählen möglicherweise bereits ausgewählte Datensätze aus und erhalten Duplikate (das hatte ich).

INSERT INTO summary SELECT t1.a, t1.b, SUMME (t1.p) ASp, COUNT (t1. *) ASc, t1.d, t1.r, DATE_TRUNC ('Monat', t1.start) AS Monat , t2.t AS t, t2.h, t2.x VON raw1 t1, raw2 t2 WO t1.t2_id = t2.id UND (t2.t <> 'a' ODER t2.y) nach t1.a, t1 .b Grenze 100 Offset 0 GRUPPE NACH Monat, t, a, b, d, r, h, x

Bei der Ausführung des nächsten Laufs stellen Sie den Offset auf 100 usw. ein.

Hoffe es hilft jemandem. :)

Belagerung
quelle
-2

Ich wette, dass postgres / tmp für die temporäre Speicherung verwendet und Ihre Root-Partition kleiner ist als die Partitionen in Ihrem System. Wenn Sie den temporären Speicher von postgres an einen Ort ändern, an dem Sie mehr Speicherplatz haben, können Sie dies beheben. Oder wie im obigen Beitrag angegeben, fügen Sie mehr Platz hinzu. Um zu bestätigen, dass dies in / tmp geschrieben wird, schauen Sie in die Konfigurationsdatei oder führen Sie während der Ausführung der Abfrage ls -lart / tmp immer wieder aus. Wenn Dateien wachsen, wird dort geschrieben. Ich bin kein Postgres-Benutzer, aber zum größten Teil sollten Sie in der Lage sein, es mit dem herauszufinden, was ich oben gesagt habe.

ScottZ
quelle
PostgreSQL verwendet / tmp normalerweise nie für temporären Speicherplatz.
Magnus Hagander