Aufgeblähte Tabelle ohne lange Sperren reorganisieren (pg_repack)
PostgreSQLWartungBefehl
-- Once per target database (the pg_repack package must be installed on the server)
CREATE EXTENSION pg_repack;
# Dry run: show what would be done
pg_repack -h localhost -U postgres -d mydb --table=public.orders --dry-run
# Rewrite the table and its indexes: 2 parallel index builds, wait at most 60 s for locks
pg_repack -h localhost -U postgres -d mydb --table=public.orders --jobs=2 --wait-timeout=60 --no-kill-backend
# Rebuild indexes only
pg_repack -h localhost -U postgres -d mydb --table=public.orders --only-indexesWas es tut
Baut im Hintergrund eine verdichtete Kopie der Tabelle auf, erfasst parallele Änderungen per Trigger in einer Log-Tabelle und tauscht die Tabellen am Ende unter einer kurzen ACCESS-EXCLUSIVE-Sperre; anders als VACUUM FULL blockiert es Lesen/Schreiben nicht für die gesamte Dauer.
Wann einsetzen
Wenn starker Bloat, den VACUUM nicht zurückgeben kann (mit pgstattuple geprüft), auf einem Live-System zurückgewonnen werden muss.
Vorsicht
Die Tabelle braucht einen PRIMARY KEY oder einen UNIQUE-Index auf NOT-NULL-Spalten. Sie benötigt vorübergehend zusätzlichen Plattenplatz in Höhe von Tabelle plus Indizes und erzeugt viel WAL (Replica-Lag, Archivvolumen). ACCESS-EXCLUSIVE-Sperren sind am Anfang und am Ende nötig; läuft --wait-timeout ab, werden standardmäßig kollidierende Abfragen abgebrochen und deren Sessions bei Bedarf beendet, während --no-kill-backend stattdessen die Tabelle überspringt. Führe während des Laufs keine DDL auf der Zieltabelle aus. Client- und Extension-Version müssen übereinstimmen. Bei Abbruch Reste bereinigen mit DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack;