Freigeben von Speicherplatz nach dem Löschen der Datenbank


12

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?


Vielleicht ist es auch erwähnenswert, dass ich die Archivierung aktiviert habe. Es scheint, dass der Speicherort, an dem die WAL-Archivdateien geschrieben werden, ziemlich groß ist. Ich habe es nicht genau beobachtet. Vielleicht versuche ich das gleiche Verfahren wie oben und führe ein "du" in diesem Verzeichnis aus, um festzustellen, ob der gesamte Speicherplatz freigegeben ist. Ich melde mich wieder.
Jmoney38

Ich nehme an, Vakuum hilft dann nicht?
Rogerdpack

Antworten:


6

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 das df -hund du -sh /unterscheidet sich. Dies liegt daran, dass dudas Dateisystem und die Größe aller Dateien sowie dfdas physische Gerät überprüft werden.

Ich hatte gerade ein Problem mit einer Datenbank, die nach a keinen Speicherplatz mehr freigab, DROP tableund 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).


2
Das lsof | grep deletedTrinkgeld 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 mit SELECT * FROM pg_stat_activityANALYSE gefunden wurde und in dieser steckt, um die gelöschten Dateien freizugeben. ! 00 GB freigegeben.
Alex North-Keys

5

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):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

Wenn wir nun eine neue Datenbank erstellen, sollte es unter $ PGDATA / base ein weiteres Unterverzeichnis geben:

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp

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:

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

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:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

Mach deine verschiedenen Datenbank-Sachen, erstelle, lösche usw. und dann:

-bash-3.2$ du -sh `ls` > ../post_sizes

um eine Vorstellung davon zu bekommen, wo sich der Speicherplatz befindet.


Ich sehe die gleichen Ergebnisse wie Sie - dh, wenn ich die Tabelle hinzufüge, wird die neue Datenbank im Basisverzeichnis angezeigt, und wenn ich sie entferne, ist sie verschwunden. Dieses Verzeichnis scheint jedoch nicht den gesamten Größenunterschied zu umfassen (dh ~ 9,6 GB)
Jmoney38

@ Jmoney38 - Aus diesem Grund habe ich empfohlen, das "du -sh 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.
gsiems

@ Jmoney38 - Wenn ich raten müsste, würde ich sagen, dass der Unterschied in den Verzeichnissen $ PGDATA / pg_log und / oder $ PGDATA / pg_xlog liegt. Protokolldateien sind für den Cluster bestimmt und werden beim Löschen einer Datenbank nicht abgeschnitten.
gsiems
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.