So stellen Sie Speicherplatz wieder her, der von einem Index belegt wurde, der teilweise erstellt wurde und durch einen Stromausfall beendet wurde

9

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=100wä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?

dkitchel
quelle
Wird der Index noch mit einer solchen Abfrage aufgelistet? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
Kassandry
Nein, es wird nicht in den Ergebnissen dieser Abfrage angezeigt.
dkitchel
1
Haben Sie etwas in der Liste, SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;das Ihnen gibt?
Dekso
Nein, das ist leer.
dkitchel

Antworten:

5

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:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0ist für den Standardtabellenbereich. Wenn der problematische Index in einem nicht standardmäßigen Tabellenbereich erstellt wurde, 0muss dieser durch seine OID in ersetzt werden pg_tablespace.

i, r, t, S, m in relkindentsprechen jeweils Indizes, Tabellen, Toastraum, Sequenzen, materialisierten Ansichten. Alle diese Objekte haben ihre Daten in Dateien, deren Namen übereinstimmen pg_relation_filenode(oid).

Auf der Festplatte sind die Datendateien unter $PGDATA/base/oid/denen oiddie oidvon der Datenbank erhalten durch select oid,datname from pg_database. Wenn wir nicht über den Standardtabellenbereich sprechen, basewird er PG_version_somelabelstattdessen durch ersetzt .

Listen Sie die Dateien auf, die mit den relfilenodes in diesem Verzeichnis übereinstimmen, und sortieren Sie sie:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(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.

Daniel Vérité
quelle
Genial! Ich habe 1 Datei im Datenverzeichnis gefunden, die nicht in der Auswahlliste angezeigt wurde. Kann ich diese Datei sicher entfernen?
dkitchel
Tatsächlich entspricht es ungefähr 800 Dateien mit Iterationen nach dem Punkt - alle wie 499807.484 usw. Kann ich diese Dateien sicher entfernen?
dkitchel
@dkitchel: das wären Segmente von jeweils 1 GB für den riesigen Index. Überprüfen Sie möglicherweise, ob ihre Zeitstempel mit dem Zeitpunkt übereinstimmen, zu dem der Erstellungsindex ausgeführt wurde. Ich hoffe, dass meine obigen Überlegungen richtig sind, aber es sind Ihre Daten, also ist es letztendlich Ihre Entscheidung!
Daniel Vérité
Ja, die Zeitstempel stimmen mit dem Zeitpunkt überein, zu dem der Index erstellt wurde, und die Summe der Dateigrößen entspricht ungefähr der Größe des Index. Ihre Argumentation scheint solide. Ich werde es mit großer Zuversicht versuchen. Danke vielmals.
dkitchel
Wenn Sie nur nachverfolgen, damit andere, die sich in der gleichen Situation befinden, die Lösung von @ DanielVerite mit Zuversicht nutzen können. Seine Lösung hat in der Tat perfekt für mich funktioniert.
dkitchel