DBAtlas · Veritabanı operasyon atlası

Eski partition'ı canlı trafiği bloklamadan ayır (DETACH CONCURRENTLY)

PostgreSQLPartition

Komut

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

DBAtlas'ta aç →

İlgili