pg_partman ile partition oluşturma ve retention'ı otomatikleştir
PostgreSQLPartitionKomut
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;
CREATE TABLE public.olcum (
id bigint GENERATED ALWAYS AS IDENTITY,
ts timestamptz NOT NULL,
deger numeric,
PRIMARY KEY (id, ts)
) PARTITION BY RANGE (ts);
-- Günlük partition, 7 gün ilerisini önceden oluştur (pg_partman 5.x söz dizimi)
SELECT partman.create_parent(
p_parent_table := 'public.olcum',
p_control := 'ts',
p_interval := '1 day',
p_premake := 7
);
-- 30 günden eski partition'ları sil
UPDATE partman.part_config
SET retention = '30 days',
retention_keep_table = false
WHERE parent_table = 'public.olcum';
-- Bakım: periyodik çalıştır (pg_cron veya pg_partman_bgw ile zamanla)
CALL partman.run_maintenance_proc();
-- Default partition'a düşen satır var mı?
SELECT * FROM partman.check_default(p_exact_count := true);Ne yapar?
pg_partman'a bir parent tabloyu kaydeder; gelecek partition'ları önceden oluşturur, retention süresini aşanları siler ve default partition'a düşen satırları raporlar.
Ne zaman kullanılır?
Günlük/aylık partition'ları elle veya özel script'le yönetmek yerine standart, izlenebilir bir otomasyon gerektiğinde (log, metrik, olay tabloları).
Dikkat
pg_partman 4.x ile 5.x arasında API değişti: 5.x'te p_type yalnızca 'range'/'list' alır (varsayılan 'range'), 4.x'teki p_type := 'native' geçersizdir; kurulu sürümü SELECT extversion FROM pg_extension WHERE extname = 'pg_partman'; ile kontrol et. create_parent varsayılan olarak bir default partition da oluşturur. retention_keep_table = false partition'ı kalıcı olarak DROP eder; arşiv gerekiyorsa true bırakıp retention_schema kullan. run_maintenance_proc() zamanlanmazsa yeni partition'lar oluşmaz ve veriler default'a düşer. pg_partman_bgw için shared_preload_libraries + restart gerekir.
İ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)
- Eski partition'ı canlı trafiği bloklamadan ayır (DETACH CONCURRENTLY)
- 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