it-swarm-eu.dev

Ich muss VACUUM FULL ohne verfügbaren Speicherplatz ausführen

Ich habe eine Tabelle, die fast 90% des Festplattenspeichers auf unserem Server belegt. Ich habe beschlossen, ein paar Spalten zu löschen, um Speicherplatz freizugeben. Aber ich muss den Speicherplatz an das Betriebssystem zurückgeben. Das Problem ist jedoch, dass ich nicht sicher bin, was passieren wird, wenn ich VACUUM FULL ausführe und nicht genügend freier Speicherplatz vorhanden ist, um eine Kopie der Tabelle zu erstellen.

Ich verstehe, dass VACUUM FULL nicht verwendet werden sollte, aber ich dachte, es wäre die beste Option in diesem Szenario.

Irgendwelche Ideen wären willkommen.

Ich verwende PostgreSQL 9.0.6

31
Justin

Da Sie nicht über genügend Speicherplatz verfügen, um ein Vacumm auszuführen oder neu zu erstellen, können Sie Ihre Postgresql-Datenbanken jederzeit neu erstellen, indem Sie sie wiederherstellen. Durch das Wiederherstellen der Datenbanken, Tabellen und Indizes werden Speicherplatz und Defragmentierung freigegeben. Anschließend können Sie die automatische Wartung einrichten, um Ihre Datenbanken regelmäßig zu leeren.

1 Sichern Sie alle Datenbanken auf Ihrem Postgresql-Server

Sie möchten alle Ihre Datenbanken auf einer Partition sichern, die über genügend Speicherplatz verfügt. Wenn Sie unter Linux waren, können Sie das Backup mit gzip weiter komprimieren, um Speicherplatz zu sparen

su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz

2 Sichern Sie Ihre Konfigurationsdateien

cp /path/to/postgresql/data_directory/*.conf /some/partition/

Stop Postgresql

pg_ctl -D /path/to/postgresql/data_directory stop

4 löscht den Inhalt des Datenverzeichnisses

rm -Rf /path/to/postgresql/data_directory/*

5 Führen Sie initdb aus, um Ihr Datenverzeichnis neu zu initialisieren.

initdb -D /path/to/postgresql/data_directory

6 Konfigurationsdateien wiederherstellen

cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf 

7 Postgresql starten

pg_ctl -D /path/to/postgresql/data_directory start

8 Stellen Sie den Speicherauszug aller von Ihnen erstellten Datenbanken wieder her

gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out
20
Craig Efrein

HINWEIS: Ich habe dies auf 9.1 getestet. Ich habe keinen 9.0 Server hier herumliegen. Ich bin mir sicher, dass es auf 9.0 funktionieren wird.


[~ # ~] Vorsicht [~ # ~] (Wie in den Kommentaren von @erny angegeben):

Note that high CPU load due to I/O operations may be expected.

Sie können dies so gut wie ohne Ausfallzeiten tun, indem Sie einen temporären Tabellenbereich verwenden. Die Ausfallzeit erfolgt in Form von exklusiven Sperren. Aber nur auf dem Tisch saugen Sie. Alles, was passieren wird, ist, dass Client-Abfragen einfach darauf warten, dass die Sperre erlangt wird if sie greifen auf die betreffende Tabelle zu. Sie müssen keine vorhandenen Verbindungen schließen.

Eine Sache, die Sie beachten sollten, ist, dass das Bewegen des Tisches und des vollen Vakuums selbst zuerst auf ein exklusives Schloss warten muss!


Zunächst benötigen Sie natürlich zusätzlichen Speicherplatz. Wie Stéphane In den Kommentaren erwähnt, muss diese mindestens doppelt so groß sein wie die betreffende Tabelle, da VACUUM FULL Eine vollständige Kopie erstellt. Wenn Sie Glück haben und dem Computer dynamisch eine Festplatte hinzufügen können, tun Sie dies. Im Fall am schlimmsten Können Sie einfach ein USB-Laufwerk anschließen (allerdings riskant und langsam)!

Mounten Sie als Nächstes das neue Gerät und stellen Sie es als Tablespace zur Verfügung:

CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';

Sie können die Tablespaces einfach auflisten, indem Sie:

\db

Überprüfen Sie den aktuellen Tabellenbereich Ihrer Tabelle (Sie müssen wissen, wohin Sie sie zurück verschieben können):

SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';

Wenn es NULL ist, befindet es sich im Standardtabellenbereich:

SHOW default_tablespace;

Wenn das ebenfalls NULL ist, ist es wahrscheinlich pg_default (Überprüfen Sie die offiziellen Dokumente falls es geändert wird).

Bewegen Sie nun den Tisch über:

ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT;  -- if autocommit is off

Staubsaugen:

VACUUM FULL mytable;

Bewegen Sie es zurück:

-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT;  -- if autocommit is off

Entfernen Sie den temporären Speicherplatz:

DROP TABLESPACE tempspace;
18
exhuma

Schnell und dreckig:

  • Stoppen Sie Postgres
  • Verschieben Sie das Hauptdatenbankverzeichnis auf eine andere Festplatte, auf der genügend Platz zum Staubsaugen vorhanden ist
  • Fügen Sie am ursprünglichen Speicherort von main einen Symlink zum neuen Speicherort hinzu
  • Vakuum
  • Löschen Sie den Symlink und verschieben Sie das Hauptverzeichnis wieder an seinen ursprünglichen Speicherort
  • Starten Sie Postgres

Z.B.,:

$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start

3
Roger Dahl

Wenn Sie über genügend Speicherplatz verfügen, um einen Speicherauszug und eine Wiederherstellung durchzuführen, sollten Sie über ausreichend Speicherplatz verfügen, um eine Vakuum-Datenbank auszuführen. Das Problem ist, dass vakuumdb --full eine Kopie der gesamten Datendatei erstellt. Sie könnten also Folgendes tun:

  1. kopieren Sie die Dateien, in denen sich die große Tabelle befindet, auf ein anderes Laufwerk, z. B. ein langsameres, größeres Laufwerk.
  2. stellen Sie symbolische Links vom ursprünglichen Speicherort zum neuen Speicherort auf dem anderen Laufwerk her.
  3. führen Sie vakuumdb --full aus. Jetzt sollte es die Daten von der anderen Festplatte lesen und die endgültige Tabelle auf Ihre ursprüngliche Datenfestplatte schreiben.
0
Gunther