$ dbaguide.com / cheat-sheets / postgresql-backup-recovery

PostgreSQL Yedek & Kurtarma Referansı

pg_dump, pg_basebackup, WAL arşivi, pgBackRest, PITR ve felaket senaryoları için production rehberi

PostgreSQL 15–18
Güncelleme: Ekim 2026 · Production-grade
RPO
Ne kadar veri? · kabul edilebilir kayıp
RTO
Ne kadar sürede? · geri dönüş süresi
Kural
3-2-1-1-0 · 3 kopya, 2 ortam, 1 off-site
+1 / +0
immutable · 0 hatalı restore testi
Altın Kural
Test edilmemiş yedek = yedek değildir
01

Temel Kavramlar & Strateji

KavramAçıklama
MantıksalSQL / nesne seviyesinde döküm. Sürüm & platform bağımsız, seçici restore kolay; büyük veride yavaş restore (indeksler yeniden kurulur).
FizikselVeri dosyalarının blok kopyası. Hızlı restore, TB ölçeğe uygun; aynı ana sürüm + platform gerekir.
SnapshotLVM / ZFS / EBS / SAN anlık görüntüsü. Crash-consistent; WAL/redo aynı volume'deyse ya da backup modu kullanılırsa güvenli.
Full / Incr / DiffTamamı / son yedekten beri / son full'den beri değişenler. Incremental zinciri uzadıkça restore süresi ve risk artar.
Hot / Warm / ColdOkuma+yazma açık / sadece okuma / sunucu kapalı. Production'da hedef: hot.
Sürekli ArşivBase backup + kesintisiz WAL akışı → PITR: herhangi bir ana geri dönüş. RPO'yu saniyelere indirir.
Yöntem Seçimi
SenaryoÖneri
< 100 GB, sürüm geçişi, tek şemapg_dump -Fd -j N
TB ölçek, kısa RTOpgBackRest / pg_basebackup + WAL
Saniyelik RPOStreaming replika + pg_receivewal
"Yanlışlıkla sildim" korumasıPITR + recovery_min_apply_delay
Araç Haritası
Mantıksalpg_dump · pg_dumpall · pg_restore
Fizikselpg_basebackup · pg_combinebackup (17+)
WALarchive_command · pg_receivewal · pg_waldump
KurumsalpgBackRest · Barman · WAL-G
Replikasyon yedek değildir: DROP TABLE veya hatalı UPDATE milisaniyeler içinde tüm standby'lara da gider. HA ≠ DR.
02

Mantıksal Yedek

pg_dump FormatıRestore AracıParalelSeçici
-Fp plainpsql✗✗
-Fc custompg_restorerestore✓
-Fd directorypg_restoredump + restore✓
-Ft tarpg_restore✗✓
Paralel Döküm & Global Nesneler
# 8 paralel iş, zstd sıkıştırma (PG16+) $ pg_dump -h db1 -U backup -Fd -j 8 -Z zstd:3 \ -f /bk/shop_$(date +%F) shop # Roller, tablespace'ler, parametreler $ pg_dumpall -h db1 -U postgres --globals-only \ > /bk/globals_$(date +%F).sql
Paralel & Seçici Restore
$ psql -f globals.sql postgres $ createdb -O app shop $ pg_restore -j 8 -d shop --no-owner /bk/shop_dir # Yalnızca tek tablo: $ pg_restore -l /bk/shop_dir > list.txt # düzenle $ pg_restore -L list.txt -d shop /bk/shop_dir $ pg_restore -t orders -d shop /bk/shop_dir
TutarlılıkTek snapshot (REPEATABLE READ) — yazmaları bloklamaz; uzun dump vacuum'u geciktirir.
Sürüm GeçişiHer zaman hedef sürümün pg_dump binary'sini kullan.
Dikkat: pg_dump rolleri ve tablespace'leri içermez. Mutlaka pg_dumpall --globals-only ile birlikte al — yoksa restore'da "role does not exist" hataları gelir.
03

Fiziksel Yedek & WAL Arşivi

ParametreDeğer / Not
wal_levelreplica (varsayılan) — PITR için yeterli
archive_modeon — restart gerekir
archive_commandYalnızca başarıda 0 dönmeli; ya da archive_library (15+)
archive_timeout60s — düşük trafikte RPO üst sınırı
summarize_walon — incremental backup için (17+)
Base Backup + Doğrulama
archive_command = 'test ! -f /arch/%f && cp %p /arch/%f' $ pg_basebackup -h db1 -U repl -D /bk/base_$(date +%F) \ -Ft -z -Xs -P -c fast $ pg_verifybackup /bk/base_2026-10-13 # manifest (13+)
Native Incremental (PG 17+)
$ pg_basebackup -D /bk/incr1 \ --incremental=/bk/full/backup_manifest # restore öncesi zinciri birleştir: $ pg_combinebackup /bk/full /bk/incr1 /bk/incr2 -o /restore
AraçÖne Çıkan
pgBackRestFull/diff/incr, paralel, sıkıştırma + şifreleme, S3/GCS/Azure, verify
BarmanMerkezi yedek sunucusu, streaming WAL, retention policy
WAL-GBulut odaklı, delta backup, hafif kurulum
Disk Dolma Riski: archive_command başarısız oldukça WAL'ler pg_wal'da birikir → disk dolar → sunucu durur. pg_stat_archiver.failed_count için alarm kur.
PostgreSQL Yedek & Kurtarma Referansı · PITR, Doğrulama & Felaket Senaryoları
04

Point-in-Time Recovery

Kritik
Adım Adım PITR
1Sunucuyu durdur: systemctl stop postgresql
2Eski data dizinini silme, taşı — pg_wal içindeki arşivlenmemiş WAL'ler gerekebilir.
3Base backup'ı aç (tar ise base.tar.gz + pg_wal.tar.gz), sahiplik: postgres.
4postgresql.conf'a restore_command + hedef parametrelerini yaz.
5touch $PGDATA/recovery.signal → başlat, logu izle.
6Hedefte veriyi kontrol et → SELECT pg_wal_replay_resume(); ile promote.
postgresql.conf (PG 12+)
restore_command = 'cp /arch/%f %p' recovery_target_time = '2026-10-13 09:59:59+03' recovery_target_inclusive = off recovery_target_action = 'pause' # pause|promote|shutdown recovery_target_timeline = 'latest' # varsayılan
HedefNe Zaman?
recovery_target_timeOlay zamanı biliniyorsa (saat dilimini yaz!)
recovery_target_xidHatalı transaction ID'si biliniyorsa
recovery_target_lsnpg_waldump ile bulunan kesin WAL konumu
recovery_target_namepg_create_restore_point() ile işaretlenen nokta
recovery_target'immediate' — tutarlı olunca hemen dur
Deploy Öncesi İşaret & pgBackRest ile PITR
SELECT pg_create_restore_point('before_deploy_v42'); $ pgbackrest --stanza=main --delta --type=time \ --target="2026-10-13 09:59:59+03" \ --target-action=promote restore
Dikkat: Promote sonrası yeni timeline başlar. Kurtarılan sunucudan hemen yeni bir base backup al; eski zincir yeni timeline'ı kapsamaz.
05

Doğrulama, Test & İzleme

KontrolAraç / Yöntem
Yedek Bütünlüğüpg_verifybackup (manifest), pgbackrest verify
Veri BütünlüğüData checksums, pg_amcheck (14+), pg_checksums --check
Arşiv Sağlığıpg_stat_archiver, .ready dosya sayısı
Restore TestiOtomatik, en az haftalık; ayrı sunucuda geri yükle → sorgu ile doğrula → RTO'yu ölç ve kaydet.
WAL Arşivi Sağlık Kontrolü
SELECT archived_count, last_archived_wal, now() - last_archived_time AS since_last, failed_count, last_failed_wal, last_failed_time FROM pg_stat_archiver; -- Arşivlenmeyi bekleyen WAL sayısı: SELECT count(*) FROM pg_ls_archive_statusdir() WHERE name LIKE '%.ready';
pgBackRest & Bütünlük Kontrolleri
$ pgbackrest --stanza=main check # arşiv + config testi $ pgbackrest --stanza=main info # yedekler & WAL aralığı $ pgbackrest --stanza=main verify $ pg_amcheck -d shop --heapallindexed -j 4
Alarm Kur
Son başarılı yedeğin yaşı > 26 saatKritik
failed_count artışı · .ready birikimiKritik
now() - last_archived_time > RPOKritik
Yedek boyutunda ani ±%30 değişimÖnemli
pg_wal / yedek diski doluluğu > %80Önemli
PG 18: initdb artık data checksum'ları varsayılan olarak açık başlatır. Eski kümelerde: pg_checksums --enable (sunucu kapalıyken).
06

Felaket Senaryoları & Kontrol Listesi

SenaryoÇözüm
Kazara DROP / DELETEPITR (recovery_target_xid / _time) veya gecikmeli standby'dan pg_dump -t
Disk / sunucu kaybıStandby promote (pg_promote()) → yeni standby: pgbackrest --type=standby restore
Fidye yazılımıImmutable repo (S3 object lock) + repo-cipher-type + ayrı kimlik bilgileri
Bozuk sayfaChecksum / pg_amcheck ile tespit → etkilenen nesneyi yedekten geri al
Bölge (region) kaybıpgBackRest çoklu repo (repo2 başka bölgede) + DR runbook
Gecikmeli Replika (1 saat)
# standby: postgresql.conf recovery_min_apply_delay = '1h' -- olay anında: replay'i durdur, veriyi kurtar SELECT pg_wal_replay_pause();
RPO / RTO yazılı ve iş birimiyle onaylıSLA → yöntem seçimiKritik
WAL arşivi açık ve izleniyorarchive_mode · pg_stat_archiverKritik
Otomatik restore testihaftalık · RTO ölçümüKritik
Off-site + şifreli kopyarepo-cipher-type · S3 object lockKritik
Retention politikası uygulanıyorrepo1-retention-full · repo1-retention-diffÖnemli
Global nesneler yedektepg_dumpall --globals-onlyÖnemli
Config dosyaları versiyonlupostgresql.conf · pg_hba.conf · pgbackrest.confÖnerilen
DR runbook güncel ve tatbik edilmişyılda 2 tatbikatÖnerilen
Kritik hemen Önemli bu çeyrek Önerilen planla