DBAtlas · Atlas d'exploitation des bases de données

Réorganiser une table gonflée sans verrous longs (pg_repack)

PostgreSQLMaintenance

Commande

-- 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-indexes

Ce 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;

Ouvrir dans DBAtlas →

Voir aussi