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.