DBAtlas · 데이터베이스 운영 아틀라스

디스크 / 테이블스페이스 가득 참

증상

'unable to extend', 'disk full', 'log file full' 오류. 쓰기가 멈추고 있다.

1. 당황하지 말고 먼저 무엇이 가득 찼는지 찾는다

datafile인가, 트랜잭션 로그인가, archive/redo 영역인가, temp인가, OS 디스크인가? 엉뚱한 곳을 정리하면 도움이 되지 않는다. OS 수준에서는 df -h로, DB 내부에서는 공간 뷰로 디스크를 확인한다.

2. 사용량을 측정한다

어떤 테이블스페이스/파일/디렉터리가 몇 퍼센트 가득 찼는가?

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. 가장 큰 소비자를 찾는다

가장 큰 테이블/세그먼트, 가장 큰 로그/아카이브 파일, 불필요한 오래된 백업을 식별한다. 대부분 하나의 폭주 테이블이나 쌓인 아카이브 로그가 원인이다.

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. 공간을 안전하게 회수한다(신속)

로그/아카이브: 백업한 후 오래된 아카이브 로그/백업을 정리한다(Oracle: RMAN delete archivelog, MSSQL: 로그 백업 후 로그 shrink). Redis: maxmemory-policy와 eviction. 운영 중인 datafile을 절대 수동으로 삭제하지 않는다. 백업 없이 아카이브 로그를 절대 삭제하지 않는다.

5. 용량을 영구적으로 늘린다

datafile에 공간을 추가하거나 autoextend를 활성화하고(Oracle: ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE), 디스크를 늘리고, 테이블스페이스를 추가한다. 근본 원인을 해결한다: 로그 로테이션, 아카이브 정리 작업, retention 정책.

6. 재발을 방지한다

디스크 사용량 알림(80%/90% 임계값)을 설정하고, 아카이브/로그 정리를 자동화하며, retention 정책을 명확히 정의한다. 이 플레이북을 다시 열 일이 없도록 한다.

DBAtlas에서 열기 →