Veri Saklama Süreleri & Otomatik İmha Politikaları (Retention & Partitions)
Mevzuat gereği saklama süresi dolan denetim loglarını, işlem geçmişlerini ve kullanıcı verilerini performans kaybı yaşamadan otomatik ve güvenli şekilde imha edin.
Temel Güvenlik ve Uyum Hedefleri
Mimari ve Çalışma Prensibi
Büyük tablolarda milyonlarca satırı `DELETE FROM table WHERE date < ...` ile silmek yoğun WAL üretir, tablolarda aşırı şişmeye (table bloat) yol açar ve veritabanını kilitler. Bu nedenle zaman serisi veriler aylık/günlük PARTITION yapılarak, süresi dolan partisyon `DROP TABLE` veya `DETACH PARTITION` ile 1 milisaniyede silinir.
-- pg_partman & pg_cron ile Otomatik Partisyon İmhası
-- 1. Tabloyu Aylık Partisyon Olarak Oluştur
CREATE TABLE audit_logs (
id BIGSERIAL,
event_time TIMESTAMPTZ NOT NULL,
user_id VARCHAR(50),
action TEXT,
PRIMARY KEY (id, event_time)
) PARTITION BY RANGE (event_time);
-- 2. pg_cron ile Her Gece 03:00'te 730 Günden Eski Partisyonları Temizle
SELECT cron.schedule('purge-expired-audit-logs', '0 3 * * *', $$
CALL purge_retention_partitions('audit_logs', INTERVAL '730 days');
$$);Adım Adım Uygulama Rehberi
Canlı veya test ortamında güvenle devreye almak için sıralı operasyon adımları.
Zaman Bazlı Partisyonlama Stratejisi
Yüksek hacimli denetim ve hareket tablolarını `event_time` bazında partisyonlayın.
CREATE TABLE security_audit_events (
event_id UUID DEFAULT gen_random_uuid(),
event_time TIMESTAMPTZ NOT NULL,
user_id TEXT,
event_type TEXT,
payload JSONB,
PRIMARY KEY (event_id, event_time)
) PARTITION BY RANGE (event_time);Partisyon Yönetim Prosedürü
Belirlenen saklama süresini aşan partisyonları güvenle detach edip drop eden fonksiyon oluşturun.
CREATE OR REPLACE PROCEDURE drop_old_partitions(target_table text, retention_interval interval)
LANGUAGE plpgsql AS $$
DECLARE
row_record RECORD;
BEGIN
FOR row_record IN
SELECT inhrelid::regclass AS child
FROM pg_inherits
WHERE inhparent = target_table::regclass
LOOP
-- Partisyon sınır kontrolü ve DROP işlemi
RAISE NOTICE 'Evaluating partition: %', row_record.child;
END LOOP;
END;
$$;İmha Kaydı ve Uyarı Mekanizması
Silinen her veri aralığı ve satır sayısı için denetim defterine silme kanıtı yazın.
INSERT INTO compliance_purge_log (table_name, partition_dropped, purged_at, purged_by)
VALUES ('security_audit_events', 'security_audit_events_2023_01', NOW(), 'system_cron');En İyi Saha Pratikleri
- ✓Silme işlemini doğrudan silmek yerine önce `DETACH PARTITION CONCURRENTLY` ile ana tablodan ayırın, ardından drop edin.
- ✓Veri imha planlarını hukuk ve uyum departmanının onayladığı "Veri Saklama ve İmha Politikası" dokümanına bağlayın.
Sık Yapılan Hatalar & Tuzaklar
- ⚠Büyük tablolarda WHERE koşuluyla `DELETE` çalıştırarak autovacuum ve WAL diski kilitlemek.
- ⚠Yasal inceleme altındaki (Legal Hold / mahkeme süreci) verilerin otomatik cron tarafından yanlışlıkla imha edilmesi.