2026년 10월 21일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00019 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00019 maximum number of session licenses exceeded 는?
ORA-00019 에러는 Oracle 데이터베이스에 접속을 시도할 때 현재 활성화된 세션 수가 라이선스로 허용된 최대 세션 수를 초과했을 때 발생합니다. 이 에러는 Oracle 라이선스 정책과 직접적으로 연관되어 있으며, LICENSE_MAX_SESSIONS 파라미터에 설정된 값을 초과하는 새로운 세션 연결이 시도될 때 트리거됩니다. 특히 업무 피크 시간대나 배치 작업이 집중되는 시간에 자주 발생하며, 데이터베이스 가용성에 직접적인 영향을 미치는 심각한 에러입니다.
주요 발생 원인
1. LICENSE_MAX_SESSIONS 파라미터 값이 너무 낮게 설정된 경우
LICENSE_MAX_SESSIONS 파라미터는 Oracle 인스턴스에 동시에 접속할 수 있는 최대 세션 수를 제한합니다. 초기 시스템 구성 시 예상 사용자 수를 과소 평가하여 이 값을 낮게 설정한 경우, 실제 운영 환경에서 사용자가 늘어남에 따라 이 에러가 발생하게 됩니다. 특히 애플리케이션 서버의 Connection Pool 설정이 변경되거나 새로운 애플리케이션이 추가될 때 급격하게 세션 수가 증가할 수 있습니다.
2. 세션이 정상적으로 종료되지 않고 좀비(Zombie) 세션으로 남아있는 경우
애플리케이션 오류, 네트워크 단절, 또는 비정상적인 클라이언트 종료로 인해 세션이 데이터베이스 내에 비활성 상태로 누적되는 경우가 있습니다. 이러한 좀비 세션들은 실제로 작업을 수행하지 않지만 라이선스 세션 카운트에는 포함되어, 신규 사용자의 접속을 차단하는 결과를 초래합니다. Connection Pool을 잘못 관리하는 애플리케이션에서 이 문제가 특히 자주 발생합니다.
3. 구매한 Oracle 라이선스 수량보다 많은 동시 접속자가 발생한 경우
Oracle 라이선스는 Named User Plus 또는 Processor 방식으로 구매되며, Named User Plus 방식의 경우 동시 접속 세션 수에 제한이 있을 수 있습니다. 비즈니스가 성장하거나 조직 구조가 변경되어 실제 사용자 수가 라이선스 허용 범위를 초과하게 되면 이 에러가 발생합니다. 이 경우에는 기술적인 해결보다 Oracle 라이선스 추가 구매가 근본적인 해결책입니다.
해결 방법
방법 1: 현재 세션 및 라이선스 설정 확인
우선 현재 시스템의 상태를 파악하는 것이 중요합니다.
-- 현재 라이선스 관련 파라미터 확인
SELECT NAME, VALUE, DESCRIPTION
FROM V$PARAMETER
WHERE NAME IN ('license_max_sessions', 'license_sessions_warning', 'license_max_users');
-- 현재 활성 세션 수 확인
SELECT COUNT(*) AS CURRENT_SESSIONS,
STATUS,
TYPE
FROM V$SESSION
GROUP BY STATUS, TYPE
ORDER BY STATUS;
-- 전체 세션 상세 내역 확인
SELECT SID,
SERIAL#,
USERNAME,
STATUS,
MACHINE,
PROGRAM,
LOGON_TIME,
LAST_CALL_ET AS IDLE_SECONDS
FROM V$SESSION
WHERE TYPE = 'USER'
ORDER BY LOGON_TIME;
방법 2: LICENSE_MAX_SESSIONS 파라미터 동적 변경
라이선스 범위 내에서 세션 제한을 즉시 늘릴 수 있습니다. 이 파라미터는 동적으로 변경 가능하여 데이터베이스 재시작 없이 적용됩니다.
-- 현재 설정 값 확인
SHOW PARAMETER LICENSE_MAX_SESSIONS;
-- 파라미터 동적 변경 (예: 200 세션으로 증가)
ALTER SYSTEM SET LICENSE_MAX_SESSIONS = 200 SCOPE=BOTH;
-- 경고 임계값도 함께 조정 (최대값의 80% 권장)
ALTER SYSTEM SET LICENSE_SESSIONS_WARNING = 160 SCOPE=BOTH;
-- 변경 후 확인
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME LIKE 'license%';
> ⚠️ 주의: LICENSE_MAX_SESSIONS를 0으로 설정하면 무제한이 되지만, 이는 라이선스 위반이 될 수 있으므로 반드시 Oracle 라이선스 계약을 확인 후 변경하세요.
방법 3: 좀비 세션 강제 종료
비활성 세션을 식별하고 강제 종료하여 세션 수를 줄입니다.
-- 장시간 비활성 상태인 세션 조회 (30분 이상 idle)
SELECT SID,
SERIAL#,
USERNAME,
STATUS,
MACHINE,
PROGRAM,
TO_CHAR(LOGON_TIME, 'YYYY-MM-DD HH24:MI:SS') AS LOGON_TIME,
LAST_CALL_ET AS IDLE_SECONDS
FROM V$SESSION
WHERE TYPE = 'USER'
AND STATUS = 'INACTIVE'
AND LAST_CALL_ET > 1800 -- 1800초 = 30분
ORDER BY LAST_CALL_ET DESC;
-- 특정 세션 강제 종료 (SID와 SERIAL# 확인 후 실행)
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
-- 여러 좀비 세션을 한 번에 종료하는 스크립트 생성
SELECT 'ALTER SYSTEM KILL SESSION ''' || SID || ',' || SERIAL# || ''' IMMEDIATE;'
AS KILL_COMMAND
FROM V$SESSION
WHERE TYPE = 'USER'
AND STATUS = 'INACTIVE'
AND LAST_CALL_ET > 3600 -- 1시간 이상 비활성
AND USERNAME IS NOT NULL;
방법 4: PROFILES를 이용한 세션 관리
사용자별 세션 제한을 설정하여 특정 사용자가 과도한 세션을 점유하는 것을 방지합니다.
-- 현재 프로파일 설정 확인
SELECT PROFILE, RESOURCE_NAME, LIMIT
FROM DBA_PROFILES
WHERE RESOURCE_NAME IN ('SESSIONS_PER_USER', 'IDLE_TIME', 'CONNECT_TIME')
ORDER BY PROFILE, RESOURCE_NAME;
-- 새 프로파일 생성 (세션 제한 포함)
CREATE PROFILE APP_USER_PROFILE LIMIT
SESSIONS_PER_USER 5 -- 사용자당 최대 5개 세션
IDLE_TIME 30 -- 30분 idle 시 자동 종료 (분 단위)
CONNECT_TIME 480 -- 최대 8시간 연결 (분 단위)
FAILED_LOGIN_ATTEMPTS 5;
-- 프로파일을 특정 사용자에게 적용
ALTER USER app_user PROFILE APP_USER_PROFILE;
-- 프로파일 적용 확인
SELECT USERNAME, PROFILE
FROM DBA_USERS
WHERE USERNAME = 'APP_USER';
예방 방법
1. 세션 모니터링 자동화 및 임계값 알림 설정
LICENSE_SESSIONS_WARNING 파라미터를 활용하여 최대 세션 수의 80% 도달 시 Oracle Alert Log에 경고가 기록되도록 설정하고, 이를 모니터링 시스템(Oracle Enterprise Manager, Zabbix, Grafana 등)과 연동하여 자동 알림을 받도록 구성하세요. 또한 아래 쿼리를 주기적으로 실행하는 모니터링 스크립트를 스케줄러(cron 또는 Oracle DBMS_SCHEDULER)에 등록하여 세션 추이를 지속적으로 추적하는 것을 권장합니다.
-- 모니터링용 세션 현황 요약 쿼리
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') AS CHECK_TIME,
COUNT(*) AS TOTAL_SESSIONS,
SUM(CASE WHEN STATUS = 'ACTIVE' THEN 1 ELSE 0 END) AS ACTIVE_SESSIONS,
SUM(CASE WHEN STATUS = 'INACTIVE' THEN 1 ELSE 0 END) AS INACTIVE_SESSIONS,
(SELECT VALUE FROM V$PARAMETER WHERE NAME = 'license_max_sessions') AS MAX_ALLOWED
FROM V$SESSION
WHERE TYPE = 'USER';
2. Connection Pool 최적화 및 세션 생명주기 관리
애플리케이션 레벨에서 Connection Pool의 최소/최대 연결 수를 적절히 설정하고, 사용하지 않는 연결은 반드시 반환하도록 애플리케이션 코드를 검토하세요. Oracle의 SQLNET.EXPIRE_TIME 파라미터를 sqlnet.ora 파일에 설정하여 Dead Connection을 자동으로 감지하고 정리하도록 구성하는 것도 필수적입니다. 또한 IDLE_TIME 프로파일을 모든 사용자에게 적용하여 일정 시간 이상 유휴 상태인 세션이 자동으로 종료되도록 하면 좀비 세션 누적을 원천적으로 방지할 수 있습니다.
관련 에러
- ORA-00018:
maximum number of sessions exceeded–SESSIONS파라미터 초과 시 발생하며, ORA-00019와 유사하지만 라이선스가 아닌 시스템 파라미터 기반의 제한입니다. - ORA-00020:
maximum number of processes exceeded–PROCESSES파라미터 초과 시 발생하며, 세션 수 초과와 함께 복합적으로 발생하는 경우가 많습니다. - ORA-02391:
exceeded simultaneous SESSIONS_PER_USER limit– 사용자 프로파일의SESSIONS_PER_USER제한을 초과할 때 발생하는 에러로, 특정 계정에서만 나타납니다. - ORA-00025:
failed to allocate xxxxxxxx– 시스템 리소스 부족과 관련된 에러로, 세션 수 초과와 함께 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.