Ich arbeite an einem Entwicklungssystem und habe eine Datenbank wiederhergestellt, sagen wir "foo", die ich für Entwicklungszwecke verwende. Während ich die Probleme durcharbeite, habe ich gerade DROP DATABASE foo ausgeführt. Ich stellte jedoch schnell fest, dass ich den gesamten Speicherplatz auf meiner Festplatte aufgebraucht hatte. Mist.
Gibt VACUUM FULL aus einer anderen logischen Datenbank Speicherplatz aus der Datenbank frei, die ich zuvor gelöscht habe (foo)? Ich habe dies aus einer anderen logischen Datenbank versucht, und freier Speicherplatz wurde zurückgefordert, aber ich glaube nicht, dass dies ausreichte, um alle von mir getätigten CREATE DATABASE / DROP DATABASE-Aufrufe zu berücksichtigen. Möglicherweise wurde die logische Datenbank, aus der ich ausgeführt habe, gerade auf VACUUM gesetzt.
Es muss eine Möglichkeit geben, diesen Speicherplatz zurückzugewinnen, ohne eine vollständige Datenbankinitialisierung durchzuführen.
BEARBEITEN
Daher habe ich die Datenbank aus einer Sicherung neu initialisiert, indem ich ungefähr die folgenden Schritte befolgt habe . Nach der Wiederherstellung habe ich eine TONNE Speicherplatz auf der Festplatte zurückgefordert! Dies funktioniert vorerst, aber jede Hilfe zum Bereinigen einer gelöschten Datenbank ist weiterhin hilfreich.
BEARBEITEN 2
Ich habe es also geschafft, weitere Informationen zu diesem Problem zu sammeln. Als Beispiel habe ich Folgendes herausgearbeitet:
Initial partition size:
Size Used Avail Use% Mounted on
25G 8.1G 16G 35% /apps1
After creating my new database and populating it:
25G 18G 6.4G 73% /apps1
After Dropping the database using "DROP database mydb" from a separate logical DB:
25G 13G 11G 56% /apps1
So scheint es mir, dass die neue DB ~ 9,6 GB auf der Festplatte beansprucht. Nach dem Löschen wuchs der zurückgewonnene Speicherplatz jedoch nur um ~ 4,6 GB. Also, es gibt ungefähr 5 GB Speicherplatz, der mich fragen lässt, was los ist !?
Und es setzt diesen Zyklus fort, wenn ich neu erstelle, auffülle und wieder ablege.
Hat jemand eine Ahnung, was nach der Ausgabe des Befehls "DROP DATABASE" noch übrig ist?
quelle
Antworten:
Probieren Sie aus
sudo lsof| grep deleted
, ob ein PostgreSQL-Prozess angezeigt wird. Dieser Befehl sucht nach Dateien, die gelöscht wurden, deren Dateideskriptoren jedoch von keinem Prozess geöffnet werden. Ein weiterer Nebeneffekt ist dasdf -h
unddu -sh /
unterscheidet sich. Dies liegt daran, dassdu
das Dateisystem und die Größe aller Dateien sowiedf
das physische Gerät überprüft werden.Ich hatte gerade ein Problem mit einer Datenbank, die nach a keinen Speicherplatz mehr freigab,
DROP table
und das war die Ursache.Die einzige mir bekannte Lösung besteht darin, die Datenbank neu zu starten. Vielleicht können Sie versuchen, ein Reload zu senden (SIGHUP).
quelle
lsof | grep deleted
Trinkgeld war gut; Fügen Sie hinzu, dass Sie nur bestimmen müssen, welche postgresql-Sitzungen noch aktiv sind, und töten Sie sie, um die Dateien freizugeben. In meinem Fall reichte es aus, von mehr als 500 aktiven Verbindungen, fast alle in IDLE oder COMMIT, eine einzige zu töten, die mitSELECT * FROM pg_stat_activity
ANALYSE gefunden wurde und in dieser steckt, um die gelöschten Dateien freizugeben. ! 00 GB freigegeben.Ich verstehe, dass wenn Sie eine Datenbank löschen, sie und ihre Dateien verschwunden sind.
Sofern Sie keine Tablespaces verwenden, sollte jede Datenbank ihre Daten in einem eigenen Unterverzeichnis unter $ PGDATA / base haben. Verwenden eines meiner Server als Beispiel (als Postgres-Benutzer):
Wenn wir nun eine neue Datenbank erstellen, sollte es unter $ PGDATA / base ein weiteres Unterverzeichnis geben:
Welches ist, was wir sehen ($ PGDATA / base / 83637 ist das Unterverzeichnis für die neue Datenbank).
Das Löschen dieser Datenbank sollte auch die Datendateien löschen:
Das ist, was wir erwarten würden - das Verzeichnis $ PGDATA / base / 83637 ist weg, es sollte nichts zum Staubsaugen geben.
Sind Sie sicher, dass nicht noch etwas Ihren Speicherplatz verschlingt? Eine Ihrer anderen Datenbanken? Protokolldateien?
Etwas, das Sie versuchen könnten, wäre:
Mach deine verschiedenen Datenbank-Sachen, erstelle, lösche usw. und dann:
um eine Vorstellung davon zu bekommen, wo sich der Speicherplatz befindet.
quelle
ls
" im Verzeichnis $ PGDATA sowohl vor als auch nach dem Hinzufügen / Löschen der Datenbank auszuführen, um zu kennzeichnen, welche anderen Verzeichnisse sprunghaft ansteigen.