
Ich verwende PostgreSQL 9.3. Ich hatte eine lang andauernde Abfrage, bei der etwa 8 Millionen Zeilen aktualisiert wurden. Irgendetwas ist offensichtlich schiefgelaufen. Zwei Tage später erhielt ich eine Warnung wegen zu wenig Speicherplatz. Ich habe die Abfrage gestoppt und das hier ist, was ich gesehen habe.
root@server:/var/lib/postgresql/9.3/main# du -BM * | sort -n
1M global
1M pg_notify
1M pg_serial
1M pg_snapshots
1M pg_stat
1M pg_stat_tmp
1M pg_tblspc
1M pg_twophase
1M PG_VERSION
1M pg_xlog/archive_status
1M mydb.opts
1M mydb.pid
3M pg_subtrans
7M base/1
7M base/12030
7M base/12035
11M base/22029472
21M pg_clog
72M pg_multixact/offsets
315M pg_log
444M pg_multixact/members
516M pg_multixact
625M pg_xlog
3493M base/pgsql_tmp
61851M base/22053373
65372M base
Beachten Sie Folgendes:61851M base/22053373
Da sich meine eigentlichen Daten in Tablespaces befinden, die auf unterschiedlichen Datenträgern gespeichert sind, gehe ich davon aus, dass sich hier temporäre Transaktionsdaten angesammelt haben.
Es gibt einige Online-Beiträge zu ähnlichen Problemen, aber ich habe keine allgemeingültige Lösung gefunden. Im Allgemeinen lautet der Ratschlag: „Führen Sie VACUUM FULL aus“, und manchmal verschwindet der angesammelte Datenmüll. Das mache ich jetzt, aber es dauert seine Zeit und ich habe Angst, dass ich den verbleibenden Speicherplatz (3 GB) aufbrauche und alles zum Absturz bringe.
Hat jemand Erfahrung damit? Was ist hier gespeichert? Gibt es eine sichere Möglichkeit, diesen Speicherplatz schnell freizugeben? Oder ihn zumindest woanders hin zu verschieben (ich habe viel Platz auf meinen Tablespace-Festplatten).
Antwort1
Ich habe es herausgefunden. Es ist mein Fehler. Dies ist eine neue Datenbank, die ein Kollege im Standardtabellenbereich erstellt hat, statt in einem unserer benutzerdefinierten.
Für diejenigen, die ähnliche Probleme haben, hier ein paar Dinge, die ich bei der Untersuchung gelernt habe. base/22053373
In meinem Fall handelt es sich um eine Datenbank. So können Sie sehen, um welche Datenbank es sich handelt:
SELECT oid, * FROM pg_database
Jede Datei darin ist nach einem OID eines PG-Typs (Tabelle oder etwas anderes) benannt. Die größten Dateien stammen wahrscheinlich aus Ihren größten Tabellen. Stellen Sie eine Verbindung zur Datenbank her und wählen Sie aus pg_class
der Sammlung aus, um herauszufinden, welche.
Im Moment verschiebe ich die Datenbank in einen benutzerdefinierten Tablespace mit
ALTER DATABASE mydb SET TABLESPACE mytablespace;
Ich bin ziemlich sicher, dass dies mein Problem lösen wird.