İçeriğe Atla
Mustafa Erbay
Rehberler veritabani-derinlemesine · 11 dk okuma · görüntülenme Read in English
100%

PostgreSQL WAL Arşivleme ile Point-in-Time Recovery Tatbikatı

WAL arşivleme, geri yükleme süresi ve güvenli kurtarma adımlarıyla PostgreSQL PITR pratiğini üretim disipliniyle kurma rehberi.

PostgreSQL WAL Arşivleme ile Point-in-Time Recovery Tatbikatı — kapak görseli

Yedek almak ile geri dönebilmek aynı şey değildir. PostgreSQL tarafında bu fark en çok Point-in-Time Recovery (PITR) senaryolarında ortaya çıkar. Snapshot vardır ama hedeflenen dakikaya dönemezsiniz; WAL vardır ama zincir eksiktir; restore vardır ama uygulama ekibi ne zaman trafik açacağını bilemez.

Bu yazıda, WAL arşivleme + base backup + tatbikat disiplini ile üretimde gerçekten işe yarayan PITR akışını ele alıyorum. Amaç “yedek var” demek değil, “şu zamana güvenle dönebiliyoruz” diyebilmektir.

1) Önce hedef: ne kadar geriye, ne kadar sürede döneceğiz?

PITR tasarımı teknik parametreyle değil, iki operasyonel soruyla başlar:

  • RPO: Kaç dakikalık veri kaybı kabul edilebilir?
  • RTO: Servis kaç dakikada tekrar ayağa kalkmalı?

Bu iki hedef, arşivleme sıklığını, depolama sınıfını ve restore altyapısını doğrudan belirler. RPO 5 dakika ise “günde bir dump” zaten tartışma dışıdır. RTO 20 dakika ise 2 TB veritabanını tek spindle diskten geri açmak da gerçekçi değildir.

2) Sağlam model: base backup + sürekli WAL arşivi

En pratik yapı:

  • Düzenli base backup
  • Sürekli ve doğrulanan WAL archive
  • Ayrı ortamda restore prova hattı

Bu üçlüden biri eksikse PITR yalnızca dokümantasyonda kalır. Base backup noktayı verir, WAL aralığı doldurur, prova hattı ise zincirin gerçekten işe yaradığını kanıtlar.

Neleri mutlaka doğrularım?

  • archive_mode=on
  • archive_command gerçekten hata kontrolü yapıyor mu?
  • Arşiv hedefi ayrı hata alanında mı? (aynı disk/kümeye yazmak risklidir)
  • WAL dosyaları restore edilmeden önce bozulma kontrolü var mı?

Basit ama yüksek değerli ilke: sessiz başarısızlık kabul edilmez. Arşivleme komutu “0” döndürüp dosyayı eksik bırakıyorsa elinizde yedek yoktur.

3) Arşiv hedefi: ucuz depolama yetmez, doğrulanabilir depolama gerekir

Sahada iki hata çok görülür:

  • WAL aynı altyapıya yazılır, ana sistem gidince arşiv de gider
  • Object storage var ama bütünlük ve erişim modeli tanımsızdır

Doğru yaklaşım:

  • Farklı hata alanına yaz
  • Yazılan nesne için checksum/bütünlük doğrulaması yap
  • Yaşam döngüsünü tanımla: kaç gün hot, kaç gün archive?
  • Restore sırasında erişim hızını ölç

Object storage kullanıyorsanız yalnızca “orada duruyor” demek yetmez. İlgili prefix için yanlış lifecycle policy, replication gecikmesi veya erişim anahtarı problemi PITR gününde ortaya çıkar.

4) Restore runbook: saat kaçta ne yapacağım?

PITR runbook’u şu kararları açık taşımalıdır:

  1. Hedef zaman damgası nasıl belirlenecek?
  2. Hangi base backup kullanılacak?
  3. Geri yüklenen kopya izole ağda mı açılacak?
  4. Uygulama tarafı ne zaman read-only veya maintenance moduna alınacak?
  5. Trafik ne zaman yeni kopyaya yönlenecek?

Örnek akış:

pg_basebackup --write-recovery-conf --pgdata /restore/pgdata
restore_command='cp /wal-archive/%f %p'
recovery_target_time='2026-04-29 10:37:00+03'

Komut satırı tek başına yeterli değil. En kritik karar, hedef zaman damgasının kimin onayıyla seçildiğidir. Erken dönerseniz veri kaybı büyür; geç dönerseniz bozuk değişiklikleri geri almış olmazsınız.

5) Tatbikat: başarı ölçütü “restore açıldı” değil

İyi tatbikatta şu sorulara cevap çıkar:

  • Hedef zamana gerçekten döndük mü?
  • Uygulama login/checkout/order gibi kritik akışları geçti mi?
  • Replikasyon veya yeni yedekleme zinciri tekrar devreye alındı mı?
  • İşlem toplam ne kadar sürdü?

Benim önerim, tatbikat sonucunu şu başlıklarla kapatmaktır:

  • Teknik sonuç: zincir çalıştı mı?
  • Süre: RTO’ya uydu mu?
  • Karar boşluğu: ekip hangi anda duraksadı?
  • Aksiyon: sonraki tatbikata kadar ne düzeliyor?

6) En pahalı hatalar

  • Arşiv hedefini hiç restore etmeden “çalışıyor” sanmak
  • Base backup ve WAL sürüm uyumsuzluğunu prova etmemek
  • PITR runbook’unu yalnızca DBA’nın bilmesi
  • Kurtarma sonrası yeni yedekleme zincirini başlatmayı unutmak

Son madde özellikle kritiktir. Restore sonrası sistem açılır ama yeni backup zinciri kurulmazsa, ikinci bir arızada tekrar kör kalırsınız.

Sonuç

PostgreSQL PITR, “yedek alıyoruz” rahatlığının değil, geri dönüş disiplininin testidir. Base backup, WAL arşivi ve düzenli tatbikat üçlüsünü birlikte işletirseniz veri kaybı penceresini gerçekten yönetebilirsiniz. Üretimde fark yaratan şey komut ezberi değil; hedef zaman, erişim modeli ve kurtarma sonrası toparlanma zincirini netleştirmektir.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Haftalık özet — AI değil, bizzat ben seçiyorum

Haftada bir mail: o haftanın en önemli yazısı, perde arkası notları, ve "bu hafta gerçekten kullandığım araç" bölümü. Az gürültü, çok sinyal.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar