PostgreSQL pg_wal Disk Dolması ve Sunucu Çöküşü: Acil WAL Tahliyesi ve Kalıcı Disk Mimarisi
Arşivleme başarısızlığı (archive_command fail) veya yetim replikasyon slotları sonucu pg_wal disk dolması, acil temizleme adımları ve max_slot_wal_keep_size koruması.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
PostgreSQL aniden işlemleri durdurur ve loglara PANIC seviyesinde çöküş mesajı basar:
PANIC: could not write to file "pg_wal/xlogtemp.12345": No space left on device
FATAL: the database system is in recovery mode▸Sahada Ne Görürsün?
Sunucu anında çöker. Yeniden başlatılırken WAL yazamadığı için recovery sürecinde tekrar kapanır. df -h çıktısında veritabanı veya WAL diski %100 doludur.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %55 | Arşivleme Başarısızlığı (`archive_command`) | Arşivleme hedefi erişilemez durumdadır. PostgreSQL arşivlenemeyen WAL'ları diski doldurana kadar saklar. |
| %30 | Yetim Replikasyon Slotu (Orphaned Slot) | Çevrimdışı kalmış replica slot'u, WAL'ların silinmesini bloke eder. |
| %15 | Uzun Transaction & Checkpoint Gecikmesi | Yüksek hacimli batch DML işlemlerinde max_wal_size sınırının aşılması. |
▸ACİL RUNBOOK (0-5dk)
rm -rf pg_wal/* ÇALIŞTIRMAYIN!** Henüz checkpoint görmemiş bir WAL dosyasını silmek veritabanını bozar.# 1. Disk durumunu ve pg_wal dosya sayısını gör
df -h
ls -lh $PGDATA/pg_wal/ | wc -l
# 2. Acil alan açmak için sistemde önceden ayrılmış dummy dosyayı sil
rm -f /var/lib/postgresql/emergency_disk_buffer.bin
# 3. Arşiv ve replication slot durumunu denetle
psql -U postgres -c "SELECT * FROM pg_stat_archiver;"
psql -U postgres -c "SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS retained_wal FROM pg_replication_slots;"
# 4. Pasif slot'u kaldırarak WAL temizliğini başlat
psql -U postgres -c "SELECT pg_drop_replication_slot('offline_replica_slot');"▸KALICI BLUEPRINT
- 1Ayrı Mount Noktası:
pg_waldizini mutlaka işletim sistemi ve veri dizininden ayrı bir NVMe/disk bölümünde (/pgwal) barındırılmalıdır. - 2Slot Koruma Limiti:
max_slot_wal_keep_size = 32GBparametresi ile tek bir replicanın ana sunucuyu çökertmesi engellenmelidir. - 3Arşiv İzleme: Prometheus
pg_stat_archiver_failed_count > 0için alarm kurulmalıdır.
▸Doğrulama
SELECT count(*) AS total_wal_files, pg_size_pretty(count(*) * 16 * 1024 * 1024) AS total_wal_size FROM pg_ls_waldir();
SELECT archived_count, failed_count, last_failed_time FROM pg_stat_archiver;Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL Bağlantı Tükenmesi ve too many clients Teşhisi
FATAL: sorry, too many clients already ve remaining connection slots hatalarının üç temel kök nedeni, yetki sınırlarıyla salt okunur pg_stat_activity teşhisi ve kalıcı iki katmanlı havuzlama çözümü.
PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
PostgreSQL connection refused: 8 Adımda Kesin Teşhis
Connection refused, timeout ve "no pg_hba.conf entry" arasındaki fark; listen_addresses, port, firewall ve Docker port yayınlama kontrolleri.