dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-wal-disk-full-no-space-left
PostgreSQL
PG 14 - 17Depolama & WAL
12 dk okuma
PANIC: could not write to file "pg_wal/..." No space left on device

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

İnceleyen:Kıdemli Veritabanı Mimarı & SRE (dataiotech Labs)
Test Edilen Sürümler: PostgreSQL 14 / 15 / 16 / 17

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 2 Kasım 2026
Test Edilen SürümlerPostgreSQL 14.10, 15.6, 16.4, 17.11 (Alpine Linux / Ubuntu 24.04)
Gerekli Yetkiİşletim sistemi root/sudo ve PostgreSQL SUPERUSER
Risk Seviyesi
Criticalpg_wal içindeki henüz checkpoint görmemiş WAL dosyalarını körlemesine silmek kalıcı veri bozulmasına yol açar
Beklenen Çıktıdf -h çıktısında pg_wal disk doluluğunun %80 altına inmesi
Geri Dönüş (Rollback) Planı:WAL diskini genişletme (LVM/EBS resize)
PostgreSQL Docs: WAL Configuration
İlk 60 Saniye Teşhis Protokolü:

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:

plaintext
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ıkKök NedenAçıklama
%55Arşivleme Başarısızlığı (`archive_command`)Arşivleme hedefi erişilemez durumdadır. PostgreSQL arşivlenemeyen WAL'ları diski doldurana kadar saklar.
%30Yetim Replikasyon Slotu (Orphaned Slot)Çevrimdışı kalmış replica slot'u, WAL'ların silinmesini bloke eder.
%15Uzun Transaction & Checkpoint GecikmesiYüksek hacimli batch DML işlemlerinde max_wal_size sınırının aşılması.

▸ACİL RUNBOOK (0-5dk)

DİKKAT / TEHLİKE
**ASLA rm -rf pg_wal/* ÇALIŞTIRMAYIN!** Henüz checkpoint görmemiş bir WAL dosyasını silmek veritabanını bozar.
bash
# 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

  1. 1Ayrı Mount Noktası: pg_wal dizini mutlaka işletim sistemi ve veri dizininden ayrı bir NVMe/disk bölümünde (/pgwal) barındırılmalıdır.
  2. 2Slot Koruma Limiti: max_slot_wal_keep_size = 32GB parametresi ile tek bir replicanın ana sunucuyu çökertmesi engellenmelidir.
  3. 3Arşiv İzleme: Prometheus pg_stat_archiver_failed_count > 0 için alarm kurulmalıdır.

▸Doğrulama

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

Tüm Hatalar (82)