ORA-01000: maximum open cursors exceeded
장애 개요
ORA-01000 오류는 Oracle 데이터베이스에서
하나의 세션(Session)이 동시에 열 수 있는
커서(Open Cursor) 개수를 초과했을 때 발생한다.
대부분 애플리케이션 또는 PL/SQL 코드에서
커서를 닫지 않거나, 커서 캐시가 과도하게 유지될 때 발생한다.
“세션 1개에 open cursor 200~300개” 가능한가?
세션 1개에서 open cursor 200~300개는 상황에 따라 충분히 발생할 수 있다.
핵심은 이것이 정상 패턴인지, 누수(미닫힘)인지를 구분하는 것이다.
1️⃣ 원리: 세션 1개 = 커서 여러 개는 구조적으로 가능
Oracle에서 커서(Cursor)는 SQL을 실행하기 위한 핸들이며,
세션(Session)은 이 커서들을 담는 컨테이너 역할을 한다.
하나의 DB 커넥션이 짧은 시간에 많은 SQL을 실행하면
여러 커서가 동시에 열려 있을 수 있다.
따라서 세션 1개에 open cursor 200~300개 자체는 기술적으로 정상이다.
2️⃣ 200~300개가 정상적으로 나오는 대표 케이스
A. ResultSet / Statement / 커서 미닫힘(누수)
JDBC 환경에서 ResultSet, Statement, PreparedStatement를
close 하지 않으면 커서가 계속 누적된다.
특히 예외 처리 경로에서 close 누락 시
시간이 지날수록 open cursor가 증가한다.
B. Statement Cache / Implicit Cursor Cache
JDBC 드라이버 또는 WAS에서 PreparedStatement 캐시를 사용하는 경우, 자주 사용하는 SQL의 커서를 재사용하기 위해 수십~수백 개의 커서를 유지할 수 있다.
C. 배치성 업무 또는 대량 SQL 처리 로직
하나의 트랜잭션에서 수백 개 SQL을 처리하고, 동시에 여러 ResultSet을 열어두는 구조라면 순간적으로 200~300개도 가능하다.
D. PL/SQL REF CURSOR 또는 동적 SQL 반복
PL/SQL에서 REF CURSOR를 다량 사용하거나, 동적 SQL을 반복 실행하면서 CLOSE를 누락하면 open cursor가 빠르게 증가한다.
3️⃣ “지속적으로 200~300개 유지”되면 위험 신호
- 잠깐 200~300 찍고 다시 내려옴 → 캐시/일시적 작업 가능성
- 시간이 갈수록 증가 (50 → 120 → 260 → 500) → 누수 가능성 높음
- ORA-01000 발생 → 대부분 미닫힘 또는 캐시 과다
4️⃣ 반드시 확인해야 할 핵심 포인트
· 서로 다른 SQL이 계속 누적되는가? → 커서 미닫힘(누수) 가능성
open cursor 점검용 SQL
세션별 open cursor 사용 현황
SELECT s.sid,
s.serial#,
s.username,
ss.value AS open_cursor_count
FROM v$sesstat ss
JOIN v$statname sn
ON ss.statistic# = sn.statistic#
JOIN v$session s
ON ss.sid = s.sid
WHERE sn.name = 'opened cursors current'
ORDER BY ss.value DESC;
특정 세션에서 열려 있는 커서(SQL) 목록
SELECT oc.sid,
oc.sql_id,
oc.cursor_type,
oc.user_name,
oc.address,
q.sql_text
FROM v$open_cursor oc
LEFT JOIN v$sql q
ON oc.sql_id = q.sql_id
WHERE oc.sid = <SID>;
같은 SQL이 반복 사용되는지 확인
SELECT sql_id,
COUNT(*) AS cursor_count
FROM v$open_cursor
WHERE sid = <SID>
GROUP BY sql_id
ORDER BY cursor_count DESC;
조치 및 권장 방향
- 애플리케이션 코드에서 모든 close() 보장
- 예외 처리 구간에서 자원 해제 여부 점검
- Statement Cache 크기 점검 및 조정
- open_cursors 증설은 임시 조치로만 사용
ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH;
7️⃣ 기본 오류 대응 4단계
- open cursor 급증 세션 식별
- SQL 유형(반복/누적) 구분
- 코드·프레임워크 설정 수정
- 지속 모니터링 및 재발 방지
정리
ORA-01000은 단순 파라미터 문제가 아니라
애플리케이션 구조와 자원 관리 품질을 보여주는 신호다.
open cursor 수 자체보다,
증가 패턴과 SQL 유형을 분석하는 것이
근본 해결의 핵심이다.
'지식 공유 > DBMS' 카테고리의 다른 글
| [PostgreSQL] 커넥션 폭주 접속 거부 (0) | 2025.12.21 |
|---|---|
| [PostgreSQL] 인증 실패 권한 문제 (0) | 2025.12.21 |
| [Oracle] ORA-12791 oradism 권한 오류 (0) | 2025.12.20 |
| PostgreSQL 데이터베이스 사용 가능 범위 (0) | 2025.12.20 |
| Oracle DBLINK 구성 방법과 보안·운영 주의사항 (1) | 2025.12.10 |