Oracle ORA-24010 오류 원인과 해결 방법 완벽 가이드

ORA-24010
2026년 10월 01일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-24010 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-24010 QUEUE does not exist 는?

ORA-24010 에러는 Oracle Advanced Queuing(AQ) 또는 Oracle Streams 환경에서 존재하지 않는 큐(Queue)에 접근하거나 작업을 수행하려 할 때 발생하는 에러입니다. 주로 큐 이름이 잘못 지정되었거나, 큐가 삭제된 이후에도 해당 큐를 참조하는 코드나 잡(Job)이 실행될 때 나타납니다. 메시지 기반 아키텍처(Message-Based Architecture)나 비동기 처리 시스템에서 빈번하게 발생하며, 운영 환경에서 갑작스러운 장애로 이어질 수 있어 즉각적인 대응이 필요합니다.


주요 발생 원인

1. 큐(Queue)가 실제로 존재하지 않거나 삭제된 경우

가장 흔한 원인으로, 개발 또는 운영 도중 해당 큐가 DBMS_AQADM.DROP_QUEUE 또는 DBMS_AQADM.DROP_QUEUE_TABLE을 통해 삭제되었음에도 불구하고, 애플리케이션이나 스케줄러 잡(Scheduler Job)이 계속해서 해당 큐를 참조하는 경우입니다. 데이터베이스 마이그레이션이나 환경 재구성 작업 시 큐를 재생성하지 않고 넘어가는 경우에도 이 문제가 자주 발생합니다.

2. 큐 이름 또는 스키마 오류

큐 이름의 대소문자 불일치, 오탈자, 또는 스키마(Schema) 접두어 누락으로 인해 시스템이 큐를 찾지 못하는 경우입니다. Oracle AQ에서 큐 이름은 기본적으로 대문자로 저장되기 때문에, 소문자나 혼합 케이스로 큐 이름을 지정하면 조회에 실패할 수 있습니다. 특히 여러 스키마에 동일한 이름의 큐가 있을 경우, 스키마명을 명시하지 않으면 잘못된 큐를 참조하거나 아예 큐를 찾지 못할 수 있습니다.

3. 큐가 정상적으로 생성되지 않았거나 생성 과정에서 오류 발생

DBMS_AQADM.CREATE_QUEUE 실행 시 권한 부족, 큐 테이블 미생성, 또는 파라미터 오류로 인해 큐 생성이 실패했음에도 이를 확인하지 않고 애플리케이션이 큐에 접근하려는 경우입니다. 이 경우 데이터 딕셔너리(Data Dictionary)에 큐가 등록되어 있지 않기 때문에 ORA-24010이 발생합니다. 특히 자동화된 배포 스크립트에서 에러 핸들링이 부재할 경우 이 상황이 자주 연출됩니다.


해결 방법

1단계: 큐 존재 여부 확인

먼저 데이터 딕셔너리 뷰를 통해 해당 큐가 실제로 존재하는지 확인합니다.

-- 현재 사용자 소유의 큐 목록 조회
SELECT name, queue_type, enqueue_enabled, dequeue_enabled
FROM user_queues;

-- DBA 권한으로 전체 큐 조회
SELECT owner, name, queue_type, enqueue_enabled, dequeue_enabled
FROM dba_queues
WHERE name = UPPER('your_queue_name');  -- 큐 이름은 대문자로 조회

-- 큐 테이블 존재 여부 확인
SELECT owner, queue_table, type
FROM dba_queue_tables
WHERE owner = 'YOUR_SCHEMA';

2단계: 큐가 없을 경우 재생성

큐가 존재하지 않는다면 큐 테이블과 큐를 순서대로 생성합니다.

-- 1) 큐 테이블 생성
BEGIN
    DBMS_AQADM.CREATE_QUEUE_TABLE(
        queue_table        => 'YOUR_SCHEMA.MY_QUEUE_TABLE',
        queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE',  -- 페이로드 타입 지정
        multiple_consumers => FALSE,
        comment            => '운영 메시지 큐 테이블'
    );
END;
/

-- 2) 큐 생성
BEGIN
    DBMS_AQADM.CREATE_QUEUE(
        queue_name    => 'YOUR_SCHEMA.MY_QUEUE',
        queue_table   => 'YOUR_SCHEMA.MY_QUEUE_TABLE',
        queue_type    => DBMS_AQADM.NORMAL_QUEUE,
        max_retries   => 5,
        retry_delay   => 60,
        comment       => '운영 메시지 큐'
    );
END;
/

-- 3) 큐 시작 (Enqueue/Dequeue 활성화)
BEGIN
    DBMS_AQADM.START_QUEUE(
        queue_name => 'YOUR_SCHEMA.MY_QUEUE',
        enqueue    => TRUE,
        dequeue    => TRUE
    );
END;
/

3단계: 큐 이름 및 스키마 확인 후 수정

-- 잘못된 큐 이름 참조 예시 (에러 발생 가능)
-- 'my_queue' 소문자 사용 시 문제 발생할 수 있음
DECLARE
    l_enqueue_options    DBMS_AQ.ENQUEUE_OPTIONS_T;
    l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
    l_message_handle     RAW(16);
    l_payload            SYS.AQ$_JMS_TEXT_MESSAGE;
BEGIN
    l_payload := SYS.AQ$_JMS_TEXT_MESSAGE.construct;
    l_payload.set_text('Test Message');

    -- 올바른 스키마 및 큐 이름 명시 (대소문자 주의)
    DBMS_AQ.ENQUEUE(
        queue_name         => 'YOUR_SCHEMA.MY_QUEUE',  -- 스키마.큐이름 형식
        enqueue_options    => l_enqueue_options,
        message_properties => l_message_properties,
        payload            => l_payload,
        msgid              => l_message_handle
    );
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('메시지 enqueue 성공: ' || RAWTOHEX(l_message_handle));
END;
/

4단계: 큐 상태 확인 및 활성화

-- 큐 상태 확인
SELECT name, 
       enqueue_enabled, 
       dequeue_enabled,
       queue_type,
       user_comment
FROM dba_queues
WHERE owner = 'YOUR_SCHEMA'
  AND name = 'MY_QUEUE';

-- 큐가 STOPPED 상태인 경우 재시작
BEGIN
    DBMS_AQADM.START_QUEUE(
        queue_name => 'YOUR_SCHEMA.MY_QUEUE',
        enqueue    => TRUE,
        dequeue    => TRUE
    );
END;
/

-- 큐 Enqueue만 활성화하고 Dequeue는 비활성화하는 경우
BEGIN
    DBMS_AQADM.START_QUEUE(
        queue_name => 'YOUR_SCHEMA.MY_QUEUE',
        enqueue    => TRUE,
        dequeue    => FALSE
    );
END;
/

5단계: 큐 관련 권한 확인

-- 특정 사용자에게 큐 Enqueue/Dequeue 권한 부여
BEGIN
    DBMS_AQADM.GRANT_QUEUE_PRIVILEGE(
        privilege  => 'ENQUEUE',
        queue_name => 'YOUR_SCHEMA.MY_QUEUE',
        grantee    => 'APP_USER',
        grant_option => FALSE
    );
END;
/

BEGIN
    DBMS_AQADM.GRANT_QUEUE_PRIVILEGE(
        privilege  => 'DEQUEUE',
        queue_name => 'YOUR_SCHEMA.MY_QUEUE',
        grantee    => 'APP_USER',
        grant_option => FALSE
    );
END;
/

-- AQ 관련 시스템 권한 확인
SELECT grantee, privilege
FROM dba_sys_privs
WHERE privilege IN ('ENQUEUE ANY QUEUE', 'DEQUEUE ANY QUEUE', 'MANAGE ANY QUEUE')
  AND grantee = 'YOUR_USER';

예방 방법

1. 큐 생성 및 관리를 위한 표준 배포 스크립트 작성 및 유지

운영 환경에 큐를 배포하거나 변경할 때는 반드시 검증된 표준 스크립트를 사용하고, 스크립트 내에 큐 존재 여부를 사전 확인하는 로직을 포함시켜야 합니다. 아래와 같이 조건부 생성 로직을 적용하면 배포 오류를 사전에 방지할 수 있습니다.

-- 큐 존재 여부 확인 후 조건부 생성
DECLARE
    v_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO v_count
    FROM dba_queues
    WHERE owner = 'YOUR_SCHEMA'
      AND name  = 'MY_QUEUE';

    IF v_count = 0 THEN
        -- 큐 테이블 생성
        DBMS_AQADM.CREATE_QUEUE_TABLE(
            queue_table        => 'YOUR_SCHEMA.MY_QUEUE_TABLE',
            queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE'
        );
        -- 큐 생성
        DBMS_AQADM.CREATE_QUEUE(
            queue_name  => 'YOUR_SCHEMA.MY_QUEUE',
            queue_table => 'YOUR_SCHEMA.MY_QUEUE_TABLE'
        );
        -- 큐 시작
        DBMS_AQADM.START_QUEUE(queue_name => 'YOUR_SCHEMA.MY_QUEUE');
        DBMS_OUTPUT.PUT_LINE('큐 생성 완료: MY_QUEUE');
    ELSE
        DBMS_OUTPUT.PUT_LINE('큐 이미 존재: MY_QUEUE');
    END IF;
END;
/

2. 모니터링 쿼리 및 알림 시스템 구축

큐의 상태를 주기적으로 모니터링하는 쿼리를 Oracle Scheduler Job으로 등록하고, 큐가 비활성화되거나 예상치 못한 상태 변경이 발생할 경우 DBA에게 즉시 알림이 가도록 설정해야 합니다. 이를 통해 장애를 사전에 감지하고 서비스 중단 시간을 최소화할 수 있습니다.

-- 큐 상태 모니터링 쿼리 (정기 실행 권장)
SELECT owner,
       name,
       queue_type,
       enqueue_enabled,
       dequeue_enabled,
       (SELECT COUNT(*) 
        FROM dba_queue_subscribers s 
        WHERE s.queue_name = q.name) AS subscriber_count
FROM dba_queues q
WHERE owner NOT IN ('SYS', 'SYSTEM', 'DBSNMP')
ORDER BY owner, name;

관련 에러

  • ORA-24011: QUEUE TABLE does not exist — 큐 테이블 자체가 존재하지 않을 때 발생하며, ORA-24010과 함께 연쇄적으로 발생할 수 있습니다.
  • ORA-24002: QUEUE TABLE does not exist (일부 버전) — 큐 테이블 관련 작업 시 발생합니다.
  • ORA-24032: Queue is not enabled for enqueue — 큐가 존재하지만 Enqueue가 비활성화된 상태에서 메시지를 삽입하려 할 때 발생합니다.
  • ORA-24033: No recipients for message — 멀티 컨슈머 큐에서 구독자 설정이 누락된 경우 발생합니다.
  • ORA-01031: insufficient privileges — 큐에 대한 접근 권한이 없을 때 발생하며, AQ 작업 시 ORA-24010과 혼동하기 쉬운 에러입니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기