Stellen Sie ohne Ausfallzeit Speicherplatz aus der gelöschten Spalte wieder her

9

Ich habe eine häufig verwendete Tabelle (mit ungefähr 5 Millionen Zeilen) in einer PostgreSQL-Datenbank, in der ich eine Spalte löschen und den von der Spalte verwendeten Speicherplatz zurückfordern möchte.

In den Dokumenten wird vorgeschlagen, eine Tabelle neu zu schreiben ALTER TABLE, um den Speicherplatz zurückzusetzen. Dies ist jedoch nicht sicher, während die Tabelle verwendet wird, und würde Ausfallzeiten verursachen. Gibt es praktische Optionen, die keine Ausfallzeiten erfordern? Ich habe versucht, das pgcompactTool auszuführen , aber das hat nichts geändert.

Viblo
quelle

Antworten:

12

ALTER TABLE .. DROP COLUMN ...markiert die Spalte als gelöscht in der Systemtabelle pg_attribute. Die Tabelle selbst wird erst dann manipuliert, wenn die Zeilen auf die eine oder andere Weise neu geschrieben wurden. Der Tropfen selbst ist sehr schnell, aber es dauert eine kurze ACCESS EXCLUSIVESperre. Ich würde das jedoch nicht als "Ausfallzeit" bezeichnen.

Das Zurückfordern von Speicherplatz ist der schwierige Teil. Sie können das Community-Tool pg_repackanstelle von VACUUM FULLoder verwenden CLUSTER(wodurch die Tabelle ausschließlich gesperrt wird). Es vermeidet exklusive Sperren, benötigt jedoch freien Speicherplatz auf der Festplatte, um zu funktionieren. Mehr Details:

Wenn die Zeilen in Ihrer Tabelle irgendwann aktualisiert werden, können Sie sie einfach abwarten. Jede neue Zeilenversion wird ohne die gelöschte Spalte geschrieben. Wenn die alte Zeilenversion von VACUUMIhnen überschrieben oder entfernt wird, erhalten Sie den Speicherplatz zurück.

Erwin Brandstetter
quelle