İçeriğe geç

Yedek ve Geri Dönüş — WHERE'siz Bir DELETE Kaç Saatlik Veriyi Götürür?

Orta 8 dk Sık karşılaşılır

Önce şunu oku: Replikasyon ve Okuma Replikaları — Yazdım Ama Göremiyorum

30 saniyede özet

Gece alınan yedek, öğlen yapılan bir hatada yarım günlük veriyi kaybettirir. Replika hatayı da kopyalar. Sürekli arşivlenen WAL ile veritabanı hatadan hemen önceki ana döner; ama yalnızca geri dönüş daha önce denendiyse.

Bir günlüğün her gece fotokopisini çekiyorsun. Öğlen bir sayfayı yanlışlıkla silersen, sabahtan beri yazdıkların gider. Yazdığın her satırı anında kopyalayan bir arkadaşın varsa, silmeyi de kopyalar.

  1. Bayt: Saat 14:30'da biri havale tablosunda bir satırı silmek istedi. WHERE yazmayı unuttu.

  2. Sen: Bütün tablo silindi! Neyse ki yedek sunucumuz var.

  3. Bayt: Yedek sunucu silmeyi bir saniyede kopyalamış, orada da tablo boş! Gece yedeği de 02:00'den.

  4. Bayt: Hatadan bir dakika öncesine dönebilmemiz gerekiyordu.

Ne kadar veri, ne kadar süre?

RPO ve RTORPO, bir felakette en fazla ne kadar süreye ait verinin kaybolabileceğidir; RTO, sistemin ne kadar sürede yeniden çalışacağıdır.Sözlükte gör → bir felakette en fazla ne kadar süreye ait verinin kaybolabileceğini söyler. RTO ise sistemin ne kadar sürede yeniden çalışacağını.

Her gece 02:00’de alınan bir yedekle, 14:30’daki bir hatadan dönersen sabahtan beri yapılan bütün havaleler gider. Gece yedeğinde RPO bir güne kadar çıkabilir.

Kafam karıştı, daha basit anlat

RPO: ne kadar veri kaybolur. RTO: ne kadar sürede dönülür. Gece yedeği yarım günü kaybettirebilir.

Hızlı kontrolBaşlangıç

RPO neyi anlatır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

RTO neyi anlatır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kopya, yedek değildir

Birincil veritabanının her değişikliği bir saniye içinde bir replikaya kopyalanıyor. WHERE'siz bir DELETE çalıştı. Replikadaki tablo ne durumda? Cevabı göster

O da boş. Replika, silmeyi de bir saniye içinde kopyaladı. Bir sunucu çöktüğünde çok işe yarar, ama bir insanın yaptığı hatadan kurtarmaz.

Hatadan bir dakika önceki sayfayı aç.
Adım adım oku
  1. Gece fotokopisi: yarım gün kaybolur.
  2. Anında kopyalayan, hatayı da kopyalar.
  3. Her sayfa sırayla saklanıyor.
  4. Hatadan bir dakika önceki sayfayı aç.

Veritabanı her değişikliği önce bir günlüğe, WALVeritabanının her değişikliği tabloya yazmadan önce sırayla kaydettiği günlük. Çökmeden sonra toparlanmak, replika ve anına dönüş için kullanılır.Sözlükte gör →’a yazar. Bu dosyalar sürekli arşivlenirse, bir temel yedeğin üstüne istenen ana kadar yeniden oynatılabilir.

Buna anına dönüşTemel bir yedeğin üstüne arşivlenmiş değişiklik kayıtlarını oynatarak veritabanını belirli bir ana geri getirmek.Sözlükte gör → denir: veritabanı 14:29:59’a döner, yalnızca hatalı komut geri alınır. Ama bunu ilk kez felaket günü denersen, arşivde eksik dosya olduğunu da o gün öğrenirsin.

Kafam karıştı, daha basit anlat

Değişiklik kayıtlarını sakla, istediğin ana dön. Ve dönüşü önceden dene.

Hızlı kontrolOrta

Her gece 02:00'de alınan bir yedekle öğlen 14:30'daki bir hatadan dönülürse ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

WAL arşivleme ile anına dönüş (PITR) nasıl çalışır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

WHERE’siz bir DELETE

Tohum 455266
  • ✕ 14:30 WHERE’siz DELETE
  • ⚠ 14:40 fark edildi
  • · geri yükleme bekleniyor
Hız
Adım 0

Şu an ne oldu?

Her gece 02:00’de tam yedek

14:30’da biri WHERE yazmadan silme komutu çalıştırıyor.

Görevler0/3

  • Yarım günlük havale kaybolsunaçık

    İpucu

    Gece yedeği.

  • Yedek sunucu da aynı hatayı kopyalasınaçık

    İpucu

    Replika.

  • Hatadan bir saniye öncesine dönaçık

    İpucu

    WAL arşivi ve denenmiş bir dönüş.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Gece yedeği: 02:00’ye dönüldü, on iki buçuk saatlik havale kayboldu.
  2. “Replika” seç. Replika silmeyi de kopyaladı; geri dönülecek bir şey yok.
  3. “Anına dönüş” seç. 14:29:59’a dönüldü; hiçbir havale kaybolmadı.
  4. “Düzenli deneniyor”u kapat. Aynı yedek, ilk denendiği gün açılamadı.
Hızlı kontrolOrta

Anlık kopyalayan bir replika, WHERE'siz bir DELETE'ten neden kurtarmaz?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Yedekler düzenli alınıyor ama kimse geri yüklemeyi denememiş. Risk nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Yedeği aynı yerde tutmak. Ana veritabanıyla aynı bölgede ya da aynı hesapta duran yedek, o bölge arızasında ya da hesap ele geçirildiğinde onunla birlikte gider. Yedeği ayrı bir yerde sakla.

Bütün veritabanını geri sarmak. Anına dönüş, hatadan sonraki doğru işlemleri de geri alır. Geri yüklenen kopyayı ayrı aç ve yalnızca silinen satırları canlıya taşı.

Önlemi unutmak. Canlıda elle değişikliği kısıtla; değişiklikleri incelenmiş betiklerle ve önce bir işlem içinde dene. En ucuz kurtarma, hiç yaşanmayan felakettir.

Kafam karıştı, daha basit anlat

Yedeği ayrı tut, cerrahi dön, elle değişikliği kısıtla.

Hızlı kontrolOrta

Yedekler neden ana veritabanından farklı bir yerde (başka bölge ya da hesap) saklanır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Havale veritabanı: WAL arşivleme, anına dönüş ve aylık deneme 4 dosya · ~31 satır · ilk okumada atlayabilirsin
Proje dosyaları

db/ postgresql.conf PostgreSQL ayarı: her WAL dosyası ayrı bir hesaptaki depoya arşivlenir.

db/postgresql.conf
wal_level = replica
archive_mode = on
# Every finished WAL segment goes to object storage in a separate account.
archive_command = 'wal-g wal-push %p'
archive_timeout = 60 # at most one minute of changes waits to be archived

db/restore/ recovery.conf (postgresql.conf on the restore server) Geri dönüş ayarı: hatadan bir saniye öncesine dön, sonra dur.

db/restore/recovery.conf (postgresql.conf on the restore server)
restore_command = 'wal-g wal-fetch %f %p'
recovery_target_time = '2026-10-04 14:29:59+03'
recovery_target_action = 'pause' # stop there so we can look before promoting

ops/ restore-drill.yaml Aylık deneme işi: son yedek ayrı bir sunucuda açılır ve satır sayıları kontrol edilir.

ops/restore-drill.yaml
# Monthly: prove the backup actually restores, on a throwaway server.
name: restore-drill
on:
schedule:
- cron: "0 6 1 * *"
jobs:
drill:
runs-on: ubuntu-latest
steps:
- run: ./ops/restore-latest-to-scratch.sh
- run: ./ops/compare-row-counts.sh transfers accounts
- run: ./ops/report-restore-duration.sh # this number is our real RTO

ops/ manual-change-template.sql Elle değişiklik: önce işlem içinde dene, etkilenen satır sayısına bak, sonra onayla.

ops/manual-change-template.sql
-- Every manual change on production starts inside a transaction.
BEGIN;
DELETE FROM transfers
WHERE id = 'b7f1c2a0-0000-4000-8000-000000000042';
-- Expect exactly 1. Anything else: ROLLBACK.
SELECT count(*) FROM transfers WHERE id = 'b7f1c2a0-0000-4000-8000-000000000042';
-- COMMIT; -- only after a second person has read the numbers above
ROLLBACK;

Kendini sına

Şimşek turu1/4

Anlık kopyalayan bir replika, yanlışlıkla silinen bir tabloyu kurtarır.

Soru 1/3İleri

Bir bankada RPO sıfıra yakın, RTO dakikalar isteniyor. Hangi birleşim uygundur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 RPO ne kadar veri kaybedilebileceğini, RTO ne kadar sürede geri dönüleceğini söyler. Gece yedeğinde RPO bir güne kadar çıkar.
  2. 2 Replika sunucu arızasına karşıdır, insan hatasına değil: hatalı bir silmeyi de aynı hızla kopyalar.
  3. 3 Temel yedek ve sürekli arşivlenen WAL, veritabanını hatadan hemen önceki ana döndürür. Denenmemiş bir yedek ise bir umuttur.
Sonraki kapı Dünkü changeset'te bir sütun boyutunu düzelttin. Test ortamında sorun yoktu; production açılmadı. Liquibase neye itiraz etti? Liquibase — Bir Satırı Düzelttim, Uygulama Neden Açılmadı? · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı