Bloat'lı tabloyu uzun süre kilitlemeden yeniden düzenle (pg_repack)
PostgreSQLBakımKomut
-- Hedef veritabanında bir kez (sunucuda pg_repack package'ı kurulu olmalı)
CREATE EXTENSION pg_repack;
# Kuru çalıştırma: ne yapılacağını göster
pg_repack -h localhost -U postgres -d veritabani --table=public.siparis --dry-run
# Tabloyu ve index'lerini yeniden yaz: 2 paralel index build, lock için en fazla 60 sn bekle
pg_repack -h localhost -U postgres -d veritabani --table=public.siparis --jobs=2 --wait-timeout=60 --no-kill-backend
# Yalnızca index'leri yeniden oluştur
pg_repack -h localhost -U postgres -d veritabani --table=public.siparis --only-indexesNe yapar?
Tablonun sıkıştırılmış kopyasını arka planda oluşturur, bu sırada gelen değişiklikleri trigger ile log tablosuna yakalar ve sonunda kısa bir ACCESS EXCLUSIVE lock ile tabloları yer değiştirir; VACUUM FULL'ün aksine işlem boyunca okuma/yazmayı bloklamaz.
Ne zaman kullanılır?
VACUUM'un geri veremediği ciddi bloat'ı (pgstattuple ile doğrulanmış) canlı sistemde diske geri kazandırmak gerektiğinde.
Dikkat
Tabloda PRIMARY KEY veya NOT NULL kolonlu bir UNIQUE index olmalıdır. Geçici olarak tablo + index'leri kadar ek disk alanı gerekir ve yoğun WAL üretir (replica gecikmesi, arşiv hacmi). Başlangıçta ve sonda ACCESS EXCLUSIVE lock gerekir; --wait-timeout dolunca varsayılan davranış çakışan sorguları iptal edip gerekirse oturumları sonlandırmaktır, --no-kill-backend bunun yerine tabloyu atlar. İşlem sürerken hedef tabloda DDL çalıştırma. İstemci ve eklenti sürümleri aynı olmalıdır. Yarıda kesilirse kalıntıları DROP EXTENSION pg_repack CASCADE; CREATE EXTENSION pg_repack; ile temizle.