dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbooks Library/postgresql/#6
Runbook #6
postgresql
CapacitySEV1 · CRITICAL OUTAGE15-30 dakika / 15-30 minssuperuser / postgres / rds_superuser

PostgreSQL WAL Directory Filling Up

Separates WAL growth due to slots, archiving, replicas and write volume and gives safe recovery steps without deleting WAL files manually.

Related Metrics:M4
Related Scripts:S13S6
#pg_wal#replication-slot#archive#disk-full

Operational Safety & Risk Notice

This runbook contains operational intervention steps; several are write-impacting (KILL, terminate, DROP, RESIZE). Verify in a staging environment first, and apply sequentially in production with verification.

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

1. Symptom & Signals

- 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. Business & Technical 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. Diagnosis & Root-Cause Analysis

🟢 Read-Only1. 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
🟢 Read-Only2. 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;
🟢 Read-Only3. 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. Remediation & Action Plan

🟡 Reversible1. 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.
🟡 Reversible2. 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.
🔴 HIGH RISK / IRREVERSIBLE3. 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.

🟡 Reversible4. 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.
🔴 HIGH RISK / IRREVERSIBLE5. **`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. Verification & Health Checks

- 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. Rollback & Contingency Plan

- 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.

More POSTGRESQL Runbooks