dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #6
postgresql
CapacitySEV1 · KRİTİK KESİNTİ15-30 dakika / 15-30 minssuperuser / postgres / rds_superuser

PostgreSQL WAL Dizini Doluyor

WAL büyümesini replikasyon slotu, arşivleme, replika ve yazma yükü olarak ayırır; dosyaları elle silmeden güvenli alan kazanma sırasını gösterir.

İlişkili Metrik:M4
İlişkili Script:S13S6
#pg_wal#replication-slot#archive#disk-full

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Belirti / Symptom

- M4 bir slotta tutulan WAL miktarını yüksek gösterir veya WAL dosya sisteminde boş alan hızla azalır.

- Log'da `No space left on device` ya da `archive command failed` görülebilir.

2. Etki / Impact

WAL diski dolduğunda yazma ve checkpoint etkilenir; veri tabanı kesintisi riski vardır. Arşiv kaybı PITR'yi, slot silme replika/CDC sürekliliğini tehlikeye atar.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. Dosya sistemi ve dizini belirleyin; WAL ayrı mount veya symlink olabilir:
sql
SHOW data_directory;
SHOW archive_mode;
SHOW archive_command;
bash
df -h /var/lib/postgresql/data/pg_wal
🟢 Salt Okunur2. Slotları S13 ile ölçün (primary, PG 10+):
sql
SELECT slot_name, slot_type, active, restart_lsn,
       pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_replication_slots ORDER BY pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) DESC NULLS LAST;
🟢 Salt Okunur3. Arşiv hata trendi ve replika durumunu ayırın:
sql
SELECT archived_count, failed_count, last_failed_wal, last_failed_time,
       last_archived_time FROM pg_stat_archiver;
SELECT application_name, state, replay_lsn FROM pg_stat_replication;

`failed_count` kümülatiftir; iki örnek arasındaki farkı alın. `archive_command` başarısızsa WAL temizlenmesi durabilir; `pg_stat_archiver` metriklerine tek başına değil loglara da bakın.

4. Müdahale / Response

🟡 Geri Alınabilir1. Arşiv hedefini ve yetkilerini düzeltin, doluysa kapasitesini artırın. Geçerli arşiv kopyası olmadan `archive_command = '/bin/true'` gibi sahte başarı döndüren komutları **kullanmayın**; PITR zinciri bozulur.
🟡 Geri Alınabilir2. Aktif slotu tüketen replika/CDC işlemini yeniden çalıştırın; backlog'un azaldığını ölçün. Yakın diskte alan yoksa kapasite artırımı en düşük veri kaybı riskli müdahaledir.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ3. Yalnızca **kesinlikle kullanım dışı** bir slot için replika/CDC sahibinin teyidinden sonra:
sql
SELECT pg_drop_replication_slot('terk_edilmis_slot');

Aktif slot silinemez; işlem CDC tüketicisini veya standby'ı yeniden kurmaya zorlayabilir.

🟡 Geri Alınabilir4. PG 13+ `max_slot_wal_keep_size` gelecekte slot tutulmasını sınırlar, ancak limitin aşılması standby'ı yeniden kurmaya zorlayabilir. Değeri RPO ve disk kapasitesine göre belirleyin. Yüksek `max_wal_size` WAL temizlemeyi geciktirebilir; öncelikle gerçek tutma nedenini bulun.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ5. **`pg_wal` içinden dosyaları elle silmeyin**, `pg_resetwal` çalıştırmayın. Bu kurtarılmayacak veri kaybına ve veritabanı bozulmasına yol açabilir.

5. Doğrulama / Verification

- Disk boş alanı yeniden güvenli seviyeye dönüyor; `failed_count` artışı durdu; gerekli slotlar ve replikalar çalışıyor.

- Yeni WAL arşivleniyor; geri yükleme/PITR zinciri doğrulanıyor.

6. Geri Alma / Rollback

- Silinen slot geri alınamaz; tüketicinin konumuna göre yeniden oluşturulması veya tekrar senkronizasyon gerekir.

- Arşiv komutu ve slot boyutu ayarları önceki değerine döndürülebilir, ancak atlanmış arşiv kopyaları geriye dönük üretilemez.

Diğer POSTGRESQL Runbook'ları