Oracle에서 UNDO 테이블스페이스는 트랜잭션 롤백과 읽기 일관성을 유지하는 핵심 요소입니다. 그런데 어느 날 갑자기 Undo 공간이 폭증한다면? 단순한 디스크 문제로 끝나지 않을 수 있습니다. 이 글에서는 Undo Tablespace가 급격히 늘어나는 주요 원인과 DBA 실전 해결 전략을 알려드립니다.
🔸 Undo Tablespace란?
Oracle의 Undo는 DML 작업(INSERT, UPDATE, DELETE)에 대한 변경 전 데이터를 저장하여
- 트랜잭션 롤백
- Consistent Read
- Flashback Query
를 가능하게 합니다.
🔸 Undo Tablespace가 갑자기 늘어나는 주요 원인
| 원인 | 설명 |
| ✅ 대용량 DML | 수백만 건 UPDATE/DELETE 트랜잭션 발생 시 Undo 폭증 |
| ✅ 장기 실행 쿼리 | 읽기 일관성을 위해 Undo를 장시간 유지해야 함 |
| ✅ 대량 병렬 작업 | 병렬 INSERT/UPDATE가 동시에 발생할 경우 |
| ✅ Flashback 설정 영향 | UNDO_RETENTION 설정 값이 크면 오래 보관 |
| ✅ 자동 확장 설정 | Undo 테이블스페이스가 AUTOEXTEND ON 상태면 무제한 팽창 가능 |
| ✅ 장기 미커밋 트랜잭션 | 커밋 안 된 트랜잭션이 Undo 블록을 계속 점유 |
🔍 진단 방법
1. Undo 사용량 모니터링
SELECT a.tablespace_name, a.file_id, a.bytes/1024/1024 AS mb, a.autoextensible
FROM dba_data_files a
WHERE tablespace_name LIKE 'UNDO%';2. Undo 세그먼트 확인
SELECT segment_name, status, tablespace_name, blocks
FROM dba_rollback_segs
ORDER BY blocks DESC;3. 장기 트랜잭션 확인
SELECT s.sid, s.serial#, s.username, t.used_ublk, t.start_time
FROM v$transaction t
JOIN v$session s ON t.ses_addr = s.saddr;🔧 해결 방안 및 튜닝 전략
✅ 1. 장기 트랜잭션 강제 종료
- 장시간 커밋되지 않은 세션 식별 후 강제 종료
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;✅ 2. Undo Retention 조정
- 너무 큰 UNDO_RETENTION 값은 오래된 Undo를 보존해서 공간 부족 초래
ALTER SYSTEM SET UNDO_RETENTION = 900;📌 주의: Flashback 기능 사용 중이면 너무 낮추면 안 됩니다.
✅ 3. Undo 자동 확장 제한
ALTER DATABASE DATAFILE '/oracle/oradata/UNDOTBS01.dbf' AUTOEXTEND OFF;→ 필요 시 수동 증가로 전환하여 예측 가능한 용량 관리
✅ 4. 대량 DML 분할 처리
- COMMIT 없이 대량 데이터 작업 시 Undo 폭증 발생
- 10,000건 단위로 끊어 작업 + 주기적 COMMIT 권장
✅ 5. Flashback 기능 비활성화 확인 (불필요 시)
SELECT flashback_on FROM v$database;
-- 필요 없으면 비활성화✅ 6. AWR 리포트로 확인
Undo 사용량이 급증한 시점의 AWR을 보면 원인 트랜잭션 파악 가능