Réorganiser une table gonflée sans verrous longs (pg_repack)
PostgreSQLMaintenanceCommande
-- 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-indexesCe que fait la commande
Construit en arrière-plan une copie compactée de la table, capture les changements concurrents dans une table de journal via un trigger, et échange les tables à la fin sous un bref verrou ACCESS EXCLUSIVE ; contrairement à VACUUM FULL, il ne bloque pas les lectures/écritures pendant toute l'opération.
Quand l'utiliser
Lorsqu'un bloat important que VACUUM ne peut pas rendre (vérifié avec pgstattuple) doit être récupéré sur un système en production.
Attention
La table doit avoir une PRIMARY KEY ou un index UNIQUE sur des colonnes NOT NULL. Elle nécessite temporairement un espace disque supplémentaire égal à la table plus ses index et génère beaucoup de WAL (retard des répliques, volume d'archives). Des verrous ACCESS EXCLUSIVE sont nécessaires au début et à la fin ; à l'expiration de --wait-timeout, le comportement par défaut est d'annuler les requêtes en conflit et, si nécessaire, de terminer leurs sessions, tandis que --no-kill-backend ignore la table. N'exécutez pas de DDL sur la table cible pendant l'opération. Les versions du client et de l'extension doivent correspondre. En cas d'interruption, nettoyez les restes avec DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack;