DBAtlas · Atlas de operações de banco de dados

Disco / tablespace cheio

Você recebeu 'unable to extend', 'disk full', 'could not extend' ou 'log full'. Sem pânico: primeiro descubra O QUE está cheio, recupere espaço com segurança e depois corrija de forma definitiva.

O que está cheio?

Limpar o lugar errado não ajuda. Meça o uso primeiro: é um datafile, o transaction log, archive/redo, temp ou o disco do SO?

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;
  • O datafile / tablespace está cheio
  • O transaction log / archive-redo está cheio
  • O temp / undo está cheio
  • O disco do SO está cheio (não o banco)

Qual é o maior consumidor?

Na maioria das vezes, uma única tabela/segmento descontrolado é o culpado. Encontre os maiores.

SELECT segment_name, segment_type, ROUND(bytes/1048576,1) AS mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;
  • Há uma tabela inesperadamente grande/descontrolada
  • Crescimento normal, o espaço realmente acabou
  • Linhas mortas demais / bloat

Por que o log está crescendo?

O log/archive não pode ser limpo até que a transação/backup ativo mais antigo termine. Por que ele se acumulou?

SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name=DB_NAME();  -- why can it not be truncated?
  • MSSQL: não estão sendo feitos backups de log (LOG_BACKUP)
  • PG: um replication slot parado está retendo WAL
  • Oracle: a área de archived logs (FRA) está cheia
  • Uma transação longa aberta está segurando o log

Causa raiz: tabela/segmento descontrolado

Um único objeto cresceu inesperadamente (inserts sem controle, uma tabela de fila/log que nunca é expurgada).

Causa raiz: necessidade real de capacidade

Crescimento normal; é preciso adicionar espaço.

Causa raiz: bloat / linhas mortas

O espaço das linhas apagadas/atualizadas não foi recuperado.

Causa raiz: temp / undo cheio

Um sort/hash grande ou uma transação longa aberta encheu o espaço temporário.

Causa raiz: disco do SO cheio

O problema está no disco do sistema operacional, não no banco. Logs, core dumps, backups antigos ou arquivos de trace podem estar ocupando espaço.

Causa raiz: backups de log não estão sendo feitos (SQL Server)

No recovery model FULL, o log cresce indefinidamente se não forem feitos backups de log.

Causa raiz: replication slot abandonado (PG)

Um slot parado (inativo) impede que o WAL seja removido e incha o pg_wal.

Causa raiz: área de archived logs (FRA) cheia (Oracle)

Os archived logs se acumularam e a FRA está cheia; quando o archiver para, o banco pode deixar de aceitar escritas.

Causa raiz: transação longa aberta

A transação ativa mais antiga está impedindo que o log/undo seja recuperado.

Abrir no DBAtlas →