Eski partition'ı canlı trafiği bloklamadan ayır (DETACH CONCURRENTLY)
PostgreSQLPartitionKomut
-- Transaction bloğu dışında çalıştırılmalıdır
ALTER TABLE satislar DETACH PARTITION satislar_2026_01 CONCURRENTLY;
-- Kesintiye uğradıysa (iptal, bağlantı kopması) partition 'detach pending' kalır; tamamla:
ALTER TABLE satislar DETACH PARTITION satislar_2026_01 FINALIZE;
-- Bekleyen detach var mı?
SELECT inhrelid::regclass AS partition_name, inhparent::regclass AS parent
FROM pg_inherits
WHERE inhdetachpending;
-- Ayrılan tablo artık bağımsızdır: arşivle veya sil
DROP TABLE satislar_2026_01;Ne yapar?
Partition'ı iki transaction'da ayırır; parent üzerinde yalnızca SHARE UPDATE EXCLUSIVE alarak çalışan sorguları bloklamaz ve ayrılan tabloya partition sınırına eşdeğer bir CHECK constraint'i ekler.
Ne zaman kullanılır?
Retention/arşivleme için eski dönemleri canlı sistemde ayırırken (ardından DROP, başka tablespace'e taşıma veya pg_dump ile arşiv).
Dikkat
BEGIN ... COMMIT bloğu içinde çalıştırılamaz ve parent'ta default partition varsa kullanılamaz. Parent'ı kullanan ve işlemden önce başlamış tüm transaction'ların bitmesini bekler; uzun transaction'lar işlemi uzatır. Kesintiye uğrarsa partition sorgulardan gizlenmiş ama ayrılmamış ('detach pending') kalır ve FINALIZE ile tamamlanmalıdır. CONCURRENTLY'siz klasik DETACH daha hızlıdır ama parent'ta ACCESS EXCLUSIVE ister; onu lock_timeout ile dene.
İlgili
- Aylık range partition'lı tablo oluştur (partition'ları döngüyle üret)
- Hazırlanmış tabloyu partition olarak kısa lock ile ekle (ATTACH PARTITION)
- Default partition tuzağı: yeni partition 'would be violated by some row' hatası verirse
- Partition pruning'in (planlama ve çalışma zamanı) gerçekten çalıştığını doğrula
- pg_partman ile partition oluşturma ve retention'ı otomatikleştir