"Yedek alıyor musun?" sorusunun iki farklı doğru cevabı var: pg_dump ve pgBackRest. İkisi rakip değil; biri mantıksal, diğeri fiziksel yedek alır ve farklı sorunları çözerler. Yanlış olanı seçmek, felaket anında "yedek var ama işe yaramıyor" demektir.

Temel fark

pg_dump veritabanını SQL ifadelerine (ya da özel bir arşiv formatına) çevirir: CREATE TABLE, COPY, CREATE INDEX. Çıktı, veritabanının mantıksal içeriğidir — belirli bir andaki tutarlı görüntüsü.

pgBackRest ise veri dosyalarının kendisini + WAL akışını yedekler. Bu, diskteki fiziksel blokların kopyasıdır ve belirli bir zamana geri dönmeyi (Point-in-Time Recovery, PITR) mümkün kılar.

pg_dump ne zaman doğru seçim

  • Tek bir veritabanını/şemayı taşımak. Sürümler arası yükseltmede (14 → 17) mantıksal dump en temiz yoldur.
  • Seçici geri yükleme. Sadece bir tabloyu geri almak istiyorsan mantıksal dump idealdir.
  • Küçük–orta veritabanları. Onlarca GB'a kadar pratiktir.
bash
PG 17
# Özel format (paralel restore + seçici geri yükleme sağlar)
pg_dump -Fc -d uygulama_db -f uygulama_$(date +%F).dump

# Sadece bir tabloyu geri yükle
pg_restore -d uygulama_db -t siparisler uygulama_2026-06-16.dump
Dikkat

pg_dump tutarlı ama zaman-noktasız bir görüntü verir: yedek başladığı andaki halidir. Yedek 2 saat sürerse, o 2 saatteki değişiklikler yedekte yoktur ama tutarlılık korunur (MVCC snapshot sayesinde). Yani "gece 03:00 dump'ı" 03:00'ı yakalar, 03:30'a geri dönemezsin. Bu iş PITR'ın işidir.

pgBackRest ne zaman doğru seçim

  • Büyük veritabanları (yüzlerce GB / TB). Fiziksel yedek + artımlı (incremental) yedekleme mantıksaldan kat kat hızlıdır.
  • Point-in-Time Recovery. "Yanlış DELETE sabah 09:14'te çalıştı, 09:13'e dönmek istiyorum" — bunu yalnızca WAL arşivi + fiziksel yedek yapar.
  • Kısa RPO/RTO hedefleri. Sürekli WAL arşivlemesi ile kayıp penceresini dakikalara/saniyelere indirir.
bash
PG 17
# Tam yedek
pgbackrest --stanza=prod --type=full backup

# Artımlı yedek (sadece değişen bloklar)
pgbackrest --stanza=prod --type=incr backup

# Belirli bir zamana geri yükle (PITR)
pgbackrest --stanza=prod \
  --type=time --target="2026-06-16 09:13:00" restore
Dikkat

pgBackRest fiziksel yedek olduğu için aynı major PostgreSQL sürümüne geri yüklenir; 16'nın fiziksel yedeğini 17'ye açamazsın. Sürüm yükseltmesi için mantıksal dump ya da pg_upgrade gerekir. Fiziksel yedeği "her derde deva" sanıp yükseltmede kullanmaya kalkmak, restore anında karşına çıkan sürprizdir.

Doğru cevap: çoğu zaman ikisi birden

Ciddi bir production'da tipik kurulum şudur:

  • pgBackRest birincil felaket kurtarma aracı: günlük full + saatlik/sürekli WAL arşivi ile PITR.
  • pg_dump yan güvence ve taşınabilirlik: haftalık mantıksal dump, sürüm-bağımsız ve tek tablo kurtarmaya açık bir arşiv.

Ve asıl kural: restore'u test et

Hangi aracı seçersen seç, test edilmemiş yedek yedek değildir. Düzenli olarak ayrı bir sunucuya geri yükle ve veriyi doğrula. Felaket günü, restore prosedürünü ilk kez denediğin gün olmamalı.

Özet

Taşıma, sürüm yükseltme, tek tablo kurtarma → pg_dump. Büyük veri, PITR, kısa kayıp penceresi → pgBackRest. Gerçek dünyada ikisini birlikte kullan ve her ikisinde de restore'u periyodik test et.