DBAtlas · Veritabanı operasyon atlası

Disk / tablespace doldu

'unable to extend', 'disk full', 'could not extend', 'log full' aldın. Panik yapma: önce NEYİN dolduğunu bul, güvenli alan kazan, sonra kalıcı çöz.

Ne doldu?

Yanlış yeri temizlemek işe yaramaz. Önce doluluğu ölç: data file mı, transaction log mu, arşiv/redo mu, temp mi, yoksa OS diski mi?

SELECT d.tablespace_name, ROUND((1-(d.alloc-NVL(f.free,0))/d.maxb)*100,1) AS pct_free
FROM (SELECT tablespace_name, SUM(bytes) alloc, SUM(GREATEST(bytes,maxbytes)) maxb FROM dba_data_files GROUP BY tablespace_name) d LEFT JOIN (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) f ON f.tablespace_name = d.tablespace_name ORDER BY pct_free;
  • Data file / tablespace dolu
  • Transaction log / arşiv-redo dolu
  • Temp / undo dolu
  • OS diski dolu (DB değil)

En büyük tüketici ne?

Çoğu zaman tek bir kaçak tablo/segment suçludur. En büyükleri bul.

SELECT segment_name, segment_type, ROUND(bytes/1048576,1) AS mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;
  • Beklenmedik büyük/kaçak tablo var
  • Normal büyüme, yer gerçekten bitti
  • Çok fazla dead tuple / bloat var

Log neden büyüyor?

Log/arşiv, en eski aktif işlem/yedek bitene kadar temizlenemez. Neden birikmiş?

SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name=DB_NAME();  -- neden truncate edilemiyor?
  • MSSQL: log yedeği alınmıyor (LOG_BACKUP)
  • PG: ilerlemeyen replication slot WAL biriktiriyor
  • Oracle: arşiv log alanı (FRA) dolu
  • Uzun açık transaction log'u tutuyor

Kök neden: Kaçak tablo/segment

Tek bir nesne beklenmedik şekilde büyümüş (kontrolsüz insert, temizlenmeyen kuyruk/log tablosu).

Kök neden: Gerçek kapasite ihtiyacı

Normal büyüme; alan eklemek gerekiyor.

Kök neden: Bloat (dead tuple)

Silinen/güncellenen satırların yeri geri kazanılmamış.

Kök neden: Temp / undo dolu

Büyük sort/hash veya uzun açık transaction geçici alanı doldurdu.

Kök neden: OS diski dolu

Sorun DB değil işletim sistemi diskinde. Loglar, core dump, eski yedekler, trace dosyaları yer kaplıyor olabilir.

Kök neden: Log yedeği alınmıyor (SQL Server)

FULL recovery modelinde log yedeği alınmazsa log sonsuz büyür.

Kök neden: Terk edilmiş replication slot (PG)

İlerlemeyen (inactive) bir slot, WAL'ın temizlenmesini engeller ve pg_wal'i şişirir.

Kök neden: Arşiv log alanı (FRA) dolu (Oracle)

Arşiv loglar birikmiş ve FRA dolmuş; arşivleyici duruncaya kadar DB yazmayı durdurabilir.

Kök neden: Uzun açık transaction

En eski aktif transaction, log/undo'nun geri kazanılmasını engelliyor.

DBAtlas'ta aç →