[ORACLE] ORA-01000 커서 초과 오류

반응형
ORA-01000 커서 초과 오류

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이 반복적으로 열려 있는가? → 캐시/재사용 문제
· 서로 다른 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단계

  1. open cursor 급증 세션 식별
  2. SQL 유형(반복/누적) 구분
  3. 코드·프레임워크 설정 수정
  4. 지속 모니터링 및 재발 방지

정리

ORA-01000은 단순 파라미터 문제가 아니라 애플리케이션 구조와 자원 관리 품질을 보여주는 신호다.
open cursor 수 자체보다, 증가 패턴과 SQL 유형을 분석하는 것이 근본 해결의 핵심이다.

반응형