DBAtlas · Atlas de operaciones de bases de datos

Disco / tablespace lleno

Síntoma

Errores 'unable to extend', 'disk full', 'log file full'; las escrituras se están deteniendo.

1. No entre en pánico; primero averigüe qué está lleno

¿Es un datafile, el log de transacciones, el área de archive/redo, temp o el disco del SO? Limpiar el lugar equivocado no sirve. Revise el disco con df -h a nivel de SO y las vistas de espacio dentro de la BD.

2. Mida el uso

¿Qué tablespace/archivo/directorio está lleno y en qué porcentaje?

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. Encuentre los mayores consumidores

Identifique las tablas/segmentos más grandes, los archivos de log/archive más grandes y los backups antiguos innecesarios. La mayoría de las veces el culpable es una sola tabla descontrolada o logs archivados 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 espacio de forma segura (rápido)

Para logs/archives: haga backup y luego purgue los logs archivados/backups antiguos (Oracle: RMAN delete archivelog; MSSQL: tome un backup de log y reduzca el log). En Redis: maxmemory-policy y eviction. NUNCA borre manualmente un datafile en uso; NUNCA borre logs archivados sin backup.

5. Aumente la capacidad de forma permanente

Agregue espacio al datafile o habilite autoextend (Oracle: ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE), amplíe el disco, agregue un tablespace. Corrija la causa raíz: rotación de logs, job de limpieza de archive, política de retención.

6. Evite que se repita

Configure alertas de uso de disco (umbrales de 80%/90%), automatice la limpieza de archive/logs y defina claramente la política de retención. Evite tener que volver a abrir este playbook.

Abrir en DBAtlas →