Ich verwende postgres (postgis) 9.4.2 auf einem Mac (10.10.4).
Ich habe ein paar große Tische (mehrere TBs).
Während eines Indexaufbaus auf einem von ihnen, der ungefähr eine Woche dauert, habe ich beobachtet, wie der verfügbare HD-Speicherplatz fast bis zu dem Punkt gesunken ist, an dem der Index beendet wäre, wenn ein Stromausfall länger andauerte als die Batterieeinheit und das System ging runter. Ich hatte Puffer ausgeschaltet und fillfactor=100
während des Builds, da es sich um eine statische Datenquelle handelt. Beim Neustart befindet sich der verfügbare Speicherplatz auf dem Laufwerk genau dort, wo er sich fast am Ende der Indexerstellung befand. Die Vakuumanalyse gibt keinen Platz frei.
Ich habe versucht, den Tisch fallen zu lassen und wieder aufzunehmen, und das hat den Platz nicht verloren. Jetzt bin ich an einem Ort, an dem ich nicht genug Platz habe, um den Index zu erstellen.
Befinden sich die während der Indexerstellung generierten Dateien in einer Schwebe, in der sie vom System nicht entfernt werden können, da der Computer während des Stromausfalls ausgefallen ist?
Wenn ich mir die Tabellengrößen + Indizes in der Datenbank ansehe (das sind die einzigen Daten auf diesem Laufwerk), summieren sie sich auf ungefähr 6 TB . Der Antrieb ist 8TB , und es gibt weniger als 500 GB auf dem Laufwerk links, so dass es dort die etwa die Größe ist ist etwa 1,5 TB verloren irgendwo scheint , dass Index gewesen wäre.
Irgendwelche Ideen?
quelle
SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;
das Ihnen gibt?Antworten:
Normalerweise würden wir erwarten, dass der Crash-Wiederherstellungsprozess beim Neustart von postgres Dateien, die sich auf einen Rollback-Index beziehen, aus dem Datenverzeichnis entfernt hat.
Nehmen wir an, dass es nicht funktioniert hat oder zumindest manuell überprüft werden muss.
Die Liste der Dateien, die sich im Datenverzeichnis befinden sollen, kann mit einer Abfrage wie der folgenden erstellt werden:
reltablespace=0
ist für den Standardtabellenbereich. Wenn der problematische Index in einem nicht standardmäßigen Tabellenbereich erstellt wurde,0
muss dieser durch seine OID in ersetzt werdenpg_tablespace
.i, r, t, S, m in
relkind
entsprechen jeweils Indizes, Tabellen, Toastraum, Sequenzen, materialisierten Ansichten. Alle diese Objekte haben ihre Daten in Dateien, deren Namen übereinstimmenpg_relation_filenode(oid)
.Auf der Festplatte sind die Datendateien unter
$PGDATA/base/oid/
denenoid
dieoid
von der Datenbank erhalten durchselect oid,datname from pg_database
. Wenn wir nicht über den Standardtabellenbereich sprechen,base
wird erPG_version_somelabel
stattdessen durch ersetzt .Listen Sie die Dateien auf, die mit den relfilenodes in diesem Verzeichnis übereinstimmen, und sortieren Sie sie:
(Damit bleibt nur das erste Segment für Relationen erhalten, die größer als 1 GB sind. Wenn verbleibende Segmente an nichts gebunden sind, sollten sie separat betrachtet werden.)
und diff diese Datei mit dem Ergebnis der obigen Abfrage.
Wenn es verbleibende Datendateien gibt, die keinem Objekt entsprechen, über das die Datenbank Bescheid weiß, sollten sie in diesem Diff angezeigt werden.
quelle