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

Disco / tablespace cheio

Sintoma

Erros 'unable to extend', 'disk full', 'log file full'; as escritas estão parando.

1. Não entre em pânico; primeiro descubra o que está cheio

É um datafile, o log de transações, a área de archive/redo, o temp ou o disco do SO? Limpar o lugar errado não ajuda. Verifique o disco com df -h no nível do SO e as views de espaço dentro do banco.

2. Meça o uso

Qual tablespace/arquivo/diretório está cheio, e em que percentual?

Oracle

SELECT d.tablespace_name, ROUND((1-(d.alloc-NVL(f.free,0))/d.maxb)*100,1) 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;

PostgreSQL

SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY 2 DESC; -- use OS df for the disk

MySQL

SELECT table_schema, ROUND(SUM(data_length+index_length)/1048576,1) mb FROM information_schema.tables GROUP BY table_schema ORDER BY mb DESC;

SQL Server

SELECT name, size/128.0 size_mb, size/128.0 - CAST(FILEPROPERTY(name,'SpaceUsed') AS int)/128.0 free_mb FROM sys.database_files;

Redis

INFO memory  # used_memory vs maxmemory

3. Encontre os maiores consumidores

Identifique as maiores tabelas/segmentos, os maiores arquivos de log/archive e backups antigos desnecessários. Na maioria das vezes, a culpa é de uma única tabela descontrolada ou de logs arquivados acumulados.

Oracle

SELECT segment_name, bytes/1048576 mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;

PostgreSQL

SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 10;

SQL Server

SELECT TOP 10 OBJECT_NAME(object_id), SUM(reserved_page_count)*8/1024 mb FROM sys.dm_db_partition_stats GROUP BY object_id ORDER BY mb DESC;

4. Recupere espaço com segurança (rápido)

Para logs/archives: faça o backup e depois remova logs arquivados/backups antigos (Oracle: RMAN delete archivelog; MSSQL: faça um backup de log e reduza o log com shrink). No Redis: maxmemory-policy e eviction. NUNCA apague manualmente um datafile em uso; NUNCA apague logs arquivados sem backup.

5. Aumente a capacidade de forma permanente

Adicione espaço ao datafile ou ative o autoextend (Oracle: ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE), aumente o disco, adicione um tablespace. Corrija a causa raiz: rotação de logs, job de limpeza de archives, política de retenção.

6. Evite a recorrência

Configure alertas de uso de disco (limites de 80%/90%), automatize a limpeza de archives/logs e defina claramente a política de retenção. Evite precisar abrir este playbook de novo.

Abrir no DBAtlas →