dataiotech Labs
Home/Güvenlik/Denetim & Uyum/Veri Saklama & İmha
← Tüm Denetim & Uyum Konuları
Veri Saklama & İmha

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.

Doğrulanan Regülasyon ve Standartlar
KVKK Madde 7GDPR Article 17 (Right to be Forgotten)PCI-DSS Req 3.1SOC 2 Retention

Temel Güvenlik ve Uyum Hedefleri

Yasal süre (Örn: 2 yıl) dolan log ve işlem kayıtlarının otomatik temizliği
`DELETE` yerine `DROP PARTITION` kullanarak sıfır kilit ve sıfır disk şişmesi (bloat) ile anlık imha
Kullanıcı "Beni Unut / Hesabı Sil" taleplerinde ilişkili tüm PII kayıtlarını cascade temizleme
İmha operasyonlarının başarıyla tamamlandığına dair imha denetim raporu üretme

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.

Referans Konfigürasyon Dosyası
-- 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ı.

1

Zaman Bazlı Partisyonlama Stratejisi

sql

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);
2

Partisyon Yönetim Prosedürü

sql

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;
$$;
3

İmha Kaydı ve Uyarı Mekanizması

sql

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.