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

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

이 글에서 다루는 내용

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

ORA-02080 database link is in use 는?

ORA-02080 에러는 Oracle Database Link(DB Link)를 삭제하거나 변경하려고 할 때, 해당 DB Link가 현재 활성 세션에 의해 사용 중인 경우 발생하는 에러입니다. 쉽게 말해, 다른 세션이 해당 DB Link를 통해 원격 데이터베이스와 연결을 유지하고 있는 상태에서 DDL 작업(DROP DATABASE LINK, ALTER DATABASE LINK 등)을 시도할 때 Oracle이 이를 차단하며 발생합니다. 이 에러는 특히 운영 환경에서 DB Link를 정리하거나 재구성할 때 자주 만나게 되는 에러로, DBA라면 반드시 처리 방법을 숙지하고 있어야 합니다.


주요 발생 원인

1. 활성 세션이 DB Link를 통해 원격 DB에 연결 중인 상태

가장 흔한 원인으로, 특정 세션이 DB Link를 사용하여 원격 데이터베이스에 쿼리를 수행 중이거나 트랜잭션을 열어 놓은 상태입니다. Oracle은 세션이 DB Link를 통해 원격 DB와 연결을 맺으면, 해당 세션이 명시적으로 연결을 해제하거나 세션이 종료되기 전까지 그 DB Link를 “in use” 상태로 표시합니다. 심지어 쿼리가 이미 완료되었더라도 세션 내에서 열린 트랜잭션이 있다면 DB Link는 여전히 사용 중 상태로 남아 있게 됩니다.

2. COMMIT 또는 ROLLBACK 없이 분산 트랜잭션이 열려 있는 경우

DB Link를 통한 DML(INSERT, UPDATE, DELETE) 작업 이후 COMMIT 또는 ROLLBACK을 명시적으로 수행하지 않으면, 해당 분산 트랜잭션이 DB Link를 계속 점유하게 됩니다. 이 상태는 애플리케이션에서 예외 처리 부재나 비정상 종료로 인해 더욱 자주 발생합니다. 분산 트랜잭션은 로컬 트랜잭션보다 훨씬 오래 DB Link를 점유할 수 있어 주의가 필요합니다.

3. 애플리케이션 또는 배치 잡이 DB Link를 지속적으로 사용 중인 경우

스케줄러 잡(DBMS_SCHEDULER), 배치 프로그램, 또는 상시 실행 중인 애플리케이션이 DB Link를 통해 주기적으로 데이터를 동기화하거나 조회하고 있는 경우, DBA가 DB Link 작업을 시도하는 타이밍에 해당 잡이 실행 중이라면 에러가 발생합니다. 이 경우는 단순히 세션을 확인하는 것만으로는 부족하고, 잡 스케줄도 함께 확인해야 합니다.


해결 방법

Step 1. DB Link를 사용 중인 세션 확인

먼저 어떤 세션이 문제의 DB Link를 사용 중인지 파악해야 합니다.

-- DB Link 사용 중인 세션 확인
SELECT
    s.sid,
    s.serial#,
    s.username,
    s.status,
    s.machine,
    s.program,
    s.logon_time,
    d.db_link
FROM
    v$session s,
    v$dblink d
WHERE
    s.saddr = d.session_addr;
-- DB Link 이름으로 직접 필터링하여 확인
SELECT
    s.sid,
    s.serial#,
    s.username,
    s.status,
    s.sql_id,
    s.event,
    d.db_link,
    d.logged_on
FROM
    v$session s
JOIN
    v$dblink d ON s.saddr = d.session_addr
WHERE
    d.db_link = 'YOUR_DB_LINK_NAME';  -- 대문자로 입력

Step 2. 해당 세션에 COMMIT/ROLLBACK 유도 또는 세션 종료

세션의 소유자(사용자 또는 애플리케이션 팀)에게 트랜잭션을 정리하도록 요청하는 것이 가장 안전한 방법입니다. 그러나 긴급한 경우 DBA가 직접 세션을 종료할 수 있습니다.

-- 세션 종료 (SID와 SERIAL# 사용)
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;

-- 예시
ALTER SYSTEM KILL SESSION '145,23891' IMMEDIATE;
-- OS 레벨에서 프로세스를 찾아 강제 종료가 필요한 경우
-- 먼저 SPID 확인
SELECT
    s.sid,
    s.serial#,
    p.spid AS os_pid,
    s.username,
    s.program
FROM
    v$session s
JOIN
    v$process p ON s.paddr = p.addr
WHERE
    s.sid IN (
        SELECT s2.sid
        FROM v$session s2, v$dblink d
        WHERE s2.saddr = d.session_addr
          AND d.db_link = 'YOUR_DB_LINK_NAME'
    );

Step 3. 세션 종료 후 DB Link 삭제 재시도

-- 세션 정리 후 DB Link 삭제
DROP DATABASE LINK your_db_link_name;

-- Public DB Link인 경우
DROP PUBLIC DATABASE LINK your_db_link_name;

Step 4. 분산 트랜잭션 강제 처리 (In-doubt 트랜잭션)

간혹 세션 종료 후에도 In-doubt 분산 트랜잭션이 남아있을 수 있습니다.

-- In-doubt 트랜잭션 확인
SELECT
    local_tran_id,
    global_tran_id,
    state,
    mixed,
    advice,
    tran_comment
FROM
    dba_2pc_pending;
-- In-doubt 트랜잭션 강제 커밋 또는 롤백
-- (주의: 데이터 정합성을 반드시 확인 후 수행)
COMMIT FORCE 'local_tran_id';
-- 또는
ROLLBACK FORCE 'local_tran_id';

-- 예시
COMMIT FORCE '1.22.135';

예방 방법

1. 애플리케이션에서 DB Link 사용 후 명시적 트랜잭션 종료 및 연결 해제 코딩 원칙 수립

DB Link를 통한 작업이 완료되면 반드시 COMMIT 또는 ROLLBACK을 명시적으로 수행하도록 애플리케이션 코딩 표준을 수립하세요. 특히 예외(Exception) 처리 블록에서도 트랜잭션이 반드시 종료될 수 있도록 FINALLY 절 또는 이에 준하는 처리를 강제화하는 것이 중요합니다. 또한 Connection Pool 환경에서는 세션 반납 전 DB Link 연결 해제 여부를 검증하는 로직을 추가하는 것을 권장합니다.

-- DB Link 세션 정리를 위한 모니터링 스크립트 (정기 실행 권장)
SELECT
    d.db_link,
    COUNT(*) AS session_count,
    MIN(s.logon_time) AS oldest_session,
    ROUND(((SYSDATE - MIN(s.logon_time)) * 24 * 60), 2) AS minutes_in_use
FROM
    v$dblink d
JOIN
    v$session s ON d.session_addr = s.saddr
GROUP BY
    d.db_link
ORDER BY
    minutes_in_use DESC;

2. DB Link 작업(DROP/ALTER) 전 사전 점검 절차 표준화

운영 환경에서 DB Link를 변경하거나 삭제하기 전에, 반드시 위의 모니터링 쿼리를 통해 현재 DB Link 사용 현황을 확인하는 절차를 Change Management 프로세스에 포함시켜야 합니다. 또한 DB Link 작업은 가급적 사용량이 적은 시간대(배치 잡이 없는 새벽 시간대 등)에 수행하도록 일정을 계획하고, 작업 전 관련 애플리케이션 팀에 사전 공지하는 문화를 정착시키는 것이 중요합니다.


관련 에러

  • ORA-02081: database link is not open — DB Link가 열려 있지 않은 상태에서 작업을 시도할 때 발생합니다.
  • ORA-02082: a loopback database link must have a connection qualifier — 루프백 DB Link 설정 오류 시 발생합니다.
  • ORA-01017: invalid username/password; logon denied — DB Link의 인증 정보가 잘못되었을 때 발생하며, DB Link 재생성 시 자주 함께 만나게 됩니다.
  • ORA-12154: TNS:could not resolve the connect identifier specified — DB Link의 TNS 설정 오류 시 발생하며, DB Link 재구성 작업 후 확인이 필요합니다.
  • ORA-02049: timeout: distributed transaction waiting for lock — DB Link를 통한 분산 트랜잭션에서 락 대기 시간 초과 시 발생하는 연관 에러입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기