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

ORA-02024
2026년 08월 08일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-02024 database link not found 는?

ORA-02024 에러는 Oracle 데이터베이스에서 참조하려는 데이터베이스 링크(Database Link)가 존재하지 않을 때 발생하는 오류입니다. 사용자가 원격 데이터베이스에 접근하기 위해 @dblink명 형식으로 쿼리를 실행하거나, 데이터베이스 링크를 삭제(DROP)하려 할 때 해당 링크가 현재 세션 또는 데이터베이스 내에 정의되어 있지 않으면 이 에러가 발생합니다. 특히 운영 환경에서 DBA가 링크를 삭제한 후 애플리케이션이 여전히 해당 링크를 참조하거나, 링크 이름 오타, 권한 부재 등 다양한 원인으로 실무에서 빈번하게 접하는 에러 중 하나입니다.


주요 발생 원인

1. 데이터베이스 링크 자체가 존재하지 않거나 삭제된 경우

가장 흔한 원인으로, 참조하는 데이터베이스 링크가 애초에 생성되지 않았거나 누군가 이미 DROP한 경우입니다. 특히 개발 → 스테이징 → 운영 환경으로 마이그레이션할 때 운영 환경에 링크가 미처 생성되지 않은 채 배포되는 경우가 자주 발생합니다. 또한 정기적인 DB 정리 작업 중 불필요한 링크로 오판하여 삭제하는 경우도 있습니다.

2. 링크 이름 오타 또는 대소문자 불일치

Oracle에서 데이터베이스 링크 이름은 대소문자를 구분하지 않는 것이 원칙이지만, 링크를 큰따옴표(")로 생성한 경우에는 대소문자를 엄격히 구분합니다. 예를 들어 "MyLink"로 생성한 링크를 MYLINK로 참조하면 ORA-02024가 발생합니다. 애플리케이션 코드나 SQL 스크립트에서 링크 이름을 하드코딩할 때 오타가 발생하는 경우도 매우 흔합니다.

3. PUBLIC/PRIVATE 링크 접근 권한 문제

데이터베이스 링크는 PUBLIC 링크와 PRIVATE 링크 두 종류가 존재합니다. PRIVATE 링크는 해당 링크를 생성한 사용자만 사용할 수 있으며, 다른 사용자가 접근하면 ORA-02024가 발생할 수 있습니다. 예를 들어 SCOTT 사용자가 생성한 PRIVATE 링크를 HR 사용자가 동일한 링크 이름으로 접근하려 하면 HR 입장에서는 링크가 존재하지 않는 것으로 인식됩니다.


해결 방법

1단계: 현재 존재하는 데이터베이스 링크 확인

먼저 현재 사용자가 접근 가능한 데이터베이스 링크 목록을 조회합니다.

-- 현재 사용자 소유의 Private 링크 조회
SELECT db_link, username, host, created
FROM user_db_links
ORDER BY db_link;

-- 모든 Public 링크 조회 (DBA 권한 필요)
SELECT db_link, owner, username, host, created
FROM dba_db_links
WHERE owner = 'PUBLIC'
ORDER BY db_link;

-- DBA가 전체 링크 조회
SELECT db_link, owner, username, host, created
FROM dba_db_links
ORDER BY owner, db_link;

2단계: 데이터베이스 링크가 없는 경우 신규 생성

링크가 존재하지 않는다면 아래와 같이 생성합니다.

-- Private 데이터베이스 링크 생성 (현재 사용자만 사용 가능)
CREATE DATABASE LINK remote_db_link
  CONNECT TO remote_user IDENTIFIED BY "password123"
  USING 'REMOTE_TNS_ALIAS';

-- Public 데이터베이스 링크 생성 (모든 사용자 사용 가능, DBA 권한 필요)
CREATE PUBLIC DATABASE LINK remote_db_link
  CONNECT TO remote_user IDENTIFIED BY "password123"
  USING '(DESCRIPTION=
            (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))
            (CONNECT_DATA=(SERVICE_NAME=REMOTEDB)))';

-- 링크 생성 후 연결 테스트
SELECT * FROM dual@remote_db_link;

3단계: 링크 이름 오타 또는 대소문자 문제 해결

-- 큰따옴표로 생성된 링크 확인 (대소문자 구분)
SELECT db_link FROM user_db_links;
-- 결과 예: MyRemoteDB

-- 잘못된 참조 (오류 발생)
-- SELECT * FROM emp@myremotedb;  -- ORA-02024 발생

-- 올바른 참조 (큰따옴표로 정확한 이름 사용)
SELECT * FROM emp@"MyRemoteDB";

-- 권장: 링크 재생성 시 대소문자 없이 단순하게 생성
DROP DATABASE LINK "MyRemoteDB";
CREATE DATABASE LINK myremotedb
  CONNECT TO remote_user IDENTIFIED BY "password123"
  USING 'REMOTE_TNS_ALIAS';

4단계: Public/Private 링크 권한 문제 해결

-- 특정 사용자가 링크를 찾지 못하는 경우 Public으로 재생성
-- (먼저 기존 Private 링크 삭제 후 Public으로 생성)

-- DBA로 접속하여 실행
DROP PUBLIC DATABASE LINK remote_db_link; -- 기존 Public 링크 삭제 (있는 경우)

-- 필요한 경우 특정 유저 소유의 Private 링크 삭제 (DBA 권한)
-- Oracle은 타 사용자의 Private 링크를 직접 삭제할 수 없으므로 해당 유저로 접속 필요
CONNECT scott/tiger;
DROP DATABASE LINK remote_db_link;

-- Public 링크로 재생성 (DBA 권한)
CONNECT / AS SYSDBA;
CREATE PUBLIC DATABASE LINK remote_db_link
  CONNECT TO remote_user IDENTIFIED BY "password123"
  USING 'REMOTE_TNS_ALIAS';

5단계: 링크 삭제 후 재생성이 필요한 경우

-- 기존 링크 삭제
DROP DATABASE LINK old_link_name;

-- 올바른 정보로 재생성
CREATE DATABASE LINK new_link_name
  CONNECT TO app_user IDENTIFIED BY "SecurePass#2024"
  USING '(DESCRIPTION=
            (LOAD_BALANCE=yes)
            (ADDRESS=(PROTOCOL=TCP)(HOST=db1.company.com)(PORT=1521))
            (ADDRESS=(PROTOCOL=TCP)(HOST=db2.company.com)(PORT=1521))
            (CONNECT_DATA=(SERVICE_NAME=PRODDB)(SERVER=DEDICATED)))';

-- 링크 동작 확인 쿼리
SELECT SYSDATE FROM dual@new_link_name;

예방 방법

1. 데이터베이스 링크 중앙 관리 및 문서화

모든 환경(개발, 스테이징, 운영)에서 사용하는 데이터베이스 링크를 중앙 위키나 형상관리 도구(Git 등)에 DDL 스크립트 형태로 문서화하여 관리하세요. 환경 이관 체크리스트에 “DB Link 생성 확인” 항목을 반드시 포함시키고, 정기적으로 dba_db_links 뷰를 조회하여 미사용 링크와 필요 링크를 감사(Audit)하는 습관을 들이는 것이 중요합니다.

-- 정기 감사용 쿼리: 링크 현황 전체 조회
SELECT owner, db_link, username, host, created
FROM dba_db_links
ORDER BY owner, created DESC;

2. 링크 존재 여부를 사전 검증하는 래퍼 프로시저 활용

애플리케이션에서 데이터베이스 링크를 직접 하드코딩하는 대신, 링크 존재 여부를 검증하는 래퍼(Wrapper) 프로시저나 함수를 만들어 활용하면 에러를 조기에 감지할 수 있습니다. 또한 EXCEPTION 블록에서 ORA-02024를 명시적으로 처리하여 사용자에게 의미 있는 오류 메시지를 제공하고, 모니터링 시스템에 알림을 발송하도록 구성하는 것을 권장합니다.

-- 링크 유효성 검사 함수 예제
CREATE OR REPLACE FUNCTION check_db_link(p_link_name IN VARCHAR2)
  RETURN BOOLEAN
IS
  v_count NUMBER;
BEGIN
  SELECT COUNT(*)
  INTO v_count
  FROM (
    SELECT db_link FROM user_db_links WHERE UPPER(db_link) = UPPER(p_link_name)
    UNION ALL
    SELECT db_link FROM all_db_links WHERE UPPER(db_link) = UPPER(p_link_name)
      AND owner = 'PUBLIC'
  );
  RETURN v_count > 0;
EXCEPTION
  WHEN OTHERS THEN
    RETURN FALSE;
END;
/

-- 사용 예
BEGIN
  IF check_db_link('REMOTE_DB_LINK') THEN
    DBMS_OUTPUT.PUT_LINE('링크 정상 존재');
  ELSE
    DBMS_OUTPUT.PUT_LINE('경고: 링크가 존재하지 않습니다!');
  END IF;
END;
/

관련 에러

  • ORA-02019: 원격 데이터베이스에 대한 연결 설명이 발견되지 않음. 데이터베이스 링크는 존재하지만 TNS 설정 문제로 원격 DB에 실제 연결이 불가한 경우 발생합니다.
  • ORA-12154: TNS 서비스 이름을 확인할 수 없음. 링크에 지정된 TNS 별칭이 tnsnames.ora에 없을 때 발생하며 ORA-02024와 함께 빈번하게 나타납니다.
  • ORA-01017: 사용자명/비밀번호가 틀림. 데이터베이스 링크는 존재하나 원격 DB의 자격증명이 변경된 경우 발생합니다. 링크를 삭제 후 올바른 자격증명으로 재생성해야 합니다.
  • ORA-02085: 데이터베이스 링크가 연결됨. 링크 이름과 원격 DB의 global_name이 일치하지 않을 때 발생하는 관련 에러입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기