HINWEIS: Ich habe dies am 9.1 getestet. Ich habe keinen 9.0 Server hier rumliegen. Ich bin mir aber sicher, dass es mit 9.0 funktionieren wird.
VORSICHT (Wie in den Kommentaren von @erny vermerkt):
Note that high CPU load due to I/O operations may be expected.
Sie können dies so gut wie ohne Ausfallzeit tun, indem Sie einen temporären Tablespace verwenden. Die Ausfallzeit erfolgt in Form von exklusiven Sperren. Aber nur auf dem Tisch saugen Sie. Alles, was passiert, ist, dass Client-Abfragen einfach darauf warten, dass die Sperre aktiviert wird wenn sie auf die betreffende Tabelle zugreifen. Sie müssen vorhandene Verbindungen nicht schließen.
Eines ist jedoch zu beachten: Wenn Sie den Tisch bewegen und das Vakuum voll ist, müssen Sie zunächst auf ein exklusives Schloss warten!
Zunächst benötigen Sie offensichtlich zusätzlichen Speicherplatz. Wie Stéphane
in den Kommentaren erwähnt, muss diese mindestens doppelt so groß wie die betreffende Tabelle sein, wie VACUUM FULL
dies bei einer vollständigen Kopie der Fall ist. Wenn Sie Glück haben und der Maschine dynamisch eine Festplatte hinzufügen können, tun Sie dies. Im schlimmsten Fall können Sie einfach ein USB-Laufwerk anschließen (riskant und langsam)!
Hängen Sie als Nächstes das neue Gerät ein 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 Folgendes verwenden:
\db
Überprüfen Sie den aktuellen Tablespace Ihrer Tabelle (Sie müssen wissen, wohin Sie ihn zurück verschieben können):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Wenn dies der NULL
Fall ist , wird der Standardtabellenbereich verwendet:
SHOW default_tablespace;
Wenn das auch so ist NULL
, wird es wahrscheinlich sein 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;
Verschiebe 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;