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
| Kavram | Açıklama |
| Mantıksal | SQL / 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). |
| Fiziksel | Veri dosyalarının blok kopyası. Hızlı restore, TB ölçeğe uygun; aynı ana sürüm + platform gerekir. |
| Snapshot | LVM / 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 / Diff | Tamamı / son yedekten beri / son full'den beri değişenler. Incremental zinciri uzadıkça restore süresi ve risk artar. |
| Hot / Warm / Cold | Okuma+yazma açık / sadece okuma / sunucu kapalı. Production'da hedef: hot. |
| Sürekli Arşiv | Base 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 şema | pg_dump -Fd -j N |
| TB ölçek, kısa RTO | pgBackRest / pg_basebackup + WAL |
| Saniyelik RPO | Streaming replika + pg_receivewal |
| "Yanlışlıkla sildim" koruması | PITR + recovery_min_apply_delay |
Araç Haritası
| Mantıksal | pg_dump · pg_dumpall · pg_restore |
| Fiziksel | pg_basebackup · pg_combinebackup (17+) |
| WAL | archive_command · pg_receivewal · pg_waldump |
| Kurumsal | pgBackRest · 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ı | Paralel | Seçici |
| -Fp plain | psql | ✗ | ✗ |
| -Fc custom | pg_restore | restore | ✓ |
| -Fd directory | pg_restore | dump + restore | ✓ |
| -Ft tar | pg_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ık | Tek snapshot (REPEATABLE READ) — yazmaları bloklamaz; uzun dump vacuum'u geciktirir. |
| Sürüm Geçişi | Her 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
| Parametre | Değer / Not |
| wal_level | replica (varsayılan) — PITR için yeterli |
| archive_mode | on — restart gerekir |
| archive_command | Yalnızca başarıda 0 dönmeli; ya da archive_library (15+) |
| archive_timeout | 60s — düşük trafikte RPO üst sınırı |
| summarize_wal | on — 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 |
| pgBackRest | Full/diff/incr, paralel, sıkıştırma + şifreleme, S3/GCS/Azure, verify |
| Barman | Merkezi yedek sunucusu, streaming WAL, retention policy |
| WAL-G | Bulut 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
| Hedef | Ne Zaman? |
| recovery_target_time | Olay zamanı biliniyorsa (saat dilimini yaz!) |
| recovery_target_xid | Hatalı transaction ID'si biliniyorsa |
| recovery_target_lsn | pg_waldump ile bulunan kesin WAL konumu |
| recovery_target_name | pg_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
| Kontrol | Araç / 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 Testi | Otomatik, 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 saat | Kritik |
failed_count artışı · .ready birikimi | Kritik |
now() - last_archived_time > RPO | Kritik |
| 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 / DELETE | PITR (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 sayfa | Checksum / 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çimi | Kritik |
| WAL arşivi açık ve izleniyorarchive_mode · pg_stat_archiver | Kritik |
| Otomatik restore testihaftalık · RTO ölçümü | Kritik |
| Off-site + şifreli kopyarepo-cipher-type · S3 object lock | Kritik |
| 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