Trouble Shooting

ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝, ORA-02063: line가 선행됨

돼지와함께춤을 2026. 3. 26. 15:53

1. 개요: ORA-03150 및 ORA-02063 오류란?

**ORA-03150(데이터베이스 링크를 위한 통신 채널의 파일 끝)**은 DB LINK를 통해 원격 DB와 통신하던 중

연결이 비정상적으로 단절되었음을 의미합니다. 주로 원격 서버의 프로세스가 강제 종료되거나 네트워크가 끊겼을 때 발생합니다.

 

이와 함께 발생하는 **ORA-02063(line가 선행됨)**은 해당 에러가 로컬이 아닌 '원격 데이터베이스(DB LINK)'로부터

전달되었음을 알리는 부가 정보입니다.

 

이 에러 스택은 로컬 DB가 원격 트랜잭션의 상태를 확정 짓지 못할 때 alert.log에 Error 3150 trapped in 2PC라는 로그와 함께 기록됩니다.

2026-03-26T15:23:22.759271+09:00
Error 3150 trapped in 2PC on transaction 35.5.76572. Cleaning up.
Error stack returned to user:
ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝
ORA-02063: line가 선행

 

2PC PENDING 개념은 아래 글에서 더욱 자세하게 다룹니다, 필요시 참고하시면 됩니다

분산 트랜잭션, 2PC PENDING

테스트 시나리오 구조

본 테스트는 로컬 DB에서 원격 DB로의 연결 방식(Shared vs Dedicated)과 작업 유형(SELECT vs DML)에 따라 장애 발생 시 로컬 DB가 어떻게 반응하는지 확인하는 것을 목표로 합니다.

  1. Shared/Dedicated DB LINK 생성: 연결 방식별 통신 특성 확인.
  2. 트랜잭션 활성화: 각 방식별로 SELECT 또는 DML 수행 후 트랜잭션 상태 모니터링.
  3. 원격 DB 강제 종료: srvctl 명령어를 통해 물리적인 연결 단절 상황 연출.
  4. 로컬 트랜잭션 정리: COMMIT 수행 시 발생하는 에러 스택 및 로그 분석.

왜 SELECT 시나리오를 테스트하는가?

일반적으로 SELECT는 데이터를 변경하지 않으므로 트랜잭션과 무관하다고 생각하기 쉽습니다.

하지만 DB LINK를 통한 조회는 로컬과 원격 데이터베이스 간의 **분산 읽기 일관성(Distributed Read Consistency)**을 유지하기 위해 내부적으로 SCN(System Change Number)을 동기화하며 트랜잭션 엔트리를 생성합니다.

 

따라서 조회 도중 원격지가 사라지면 로컬 DB는 이 '열려 있는' 분산 트랜잭션을 어떻게 처리해야 할지 판단해야 하며,

이 과정에서 발생하는 로그를 분석하는 것이 장애 대응의 핵심입니다.

 


2. 테스트 환경 준비

-- 1. SHARED 방식 링크 생성
CREATE SHARED PUBLIC DATABASE LINK DEVLINK
CONNECT TO [SCHEMA] IDENTIFIED BY [PASSWORD]
AUTHENTICATED BY [SCHEMA] IDENTIFIED BY [PASSWORD]
USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = [PORT])) (CONNECT_DATA = (SERVICE_NAME = [SERVICE_NAME])))';

-- 2. DEDICATED 방식 링크 생성
CREATE PUBLIC DATABASE LINK DEVLINK2
CONNECT TO [SCHEMA] IDENTIFIED BY [PASSWORD]
USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = [IP])(PORT = [PORT])) (CONNECT_DATA = (SERVICE_NAME = [SERVICE_NAME])))';

-- 3. 링크 설정 확인 (AUTHUSR 컬럼 존재 시 Shared 방식)
SELECT NAME, AUTHUSR FROM SYS.LINK$;
-- DEVLINK  : [SCHEMA]
-- DEVLINK2 : (null)

3. 장애 재현 및 테스트 결과

케이스 1: Shared Link + SELECT 조회

[로컬 DB] 작업 및 트랜잭션 확인

SELECT * FROM DUAL@DEVLINK;

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 000000010AE7F840  23  1  42565  000000011CD62530

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM FROM V$SESSION WHERE SADDR ='000000011CD62530';
-- 결과: 000000011CD62530  877  26990  SYSTEM  [HOSTNAME]  [PROGRAM]

 

[원격 DB] 세션 상태 확인 및 강제 종료

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM, SERVER FROM V$SESSION WHERE USERNAME = '[SCHEMA]';
-- 결과 1: 00000000ED0D97B8  393  63891  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  DEDICATED
-- 결과 2: 00000000ED0EAF10  400  25455  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  PSEUDO

-- 원격 DB 강제 종료 및 재기동
srvctl stop database -d [SERVICE_NAME] -o abort
srvctl start database -d [SERVICE_NAME]

 

[로컬 DB] 결과 확인

-- 분산 트랜잭션 정리를 위해 명시적 COMMIT 수행
COMMIT;

/* [Alert Log 기록]
2026-03-26T13:55:32.824648+09:00
Error 3150 trapped in 2PC on transaction 23.1.42565. Cleaning up.
Error stack returned to user:
ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝
ORA-02063: line가 선행됨 (DEVLINK로 부터)
*/

케이스 2: Dedicated Link + SELECT 조회

[로컬 DB] 작업 및 트랜잭션 확인

SELECT * FROM DUAL@DEVLINK2;

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 000000010AE7F840  5  2  23997  000000011CD62530

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM FROM V$SESSION WHERE SADDR ='000000011CD62530';
-- 결과: 000000011CD62530  877  26990  SYSTEM  [HOSTNAME]  [PROGRAM]

 

[원격 DB] 세션 상태 확인 및 강제 종료

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM, SERVER FROM V$SESSION WHERE USERNAME = '[SCHEMA]';
-- 결과: 00000000ED4B7A90  790  309  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  DEDICATED

-- 원격 DB 강제 종료 및 재기동
srvctl stop database -d [SERVICE_NAME] -o abort
srvctl start database -d [SERVICE_NAME]

 

[로컬 DB] 결과 확인

-- 분산 트랜잭션 정리를 위해 명시적 COMMIT 수행
COMMIT;

/* [Alert Log 기록]
2026-03-26T15:01:35.191892+09:00
Error 3150 trapped in 2PC on transaction 5.2.23997. Cleaning up.
Error stack returned to user:
ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝
ORA-02063: line가 선행됨 (DEVLINK2로 부터)
*/

케이스 3: Shared Link + DML 수정

[로컬 DB] 데이터 수정 및 트랜잭션 확인

UPDATE [SCHEMA].[TABLE]@DEVLINK SET COL1 = 'SHARED_DML' WHERE ROWNUM = 1;

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 000000010AE7F840  38  26  40984  000000011CD62530

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM FROM V$SESSION WHERE SADDR ='000000011CD62530';
-- 결과: 000000011CD62530  877  26990  SYSTEM  [HOSTNAME]  [PROGRAM]

 

[원격 DB] 트랜잭션 상태 확인 및 강제 종료

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM, SERVER FROM V$SESSION WHERE USERNAME = '[SCHEMA]';
-- 결과 1: 00000000ED0EAF10  400  43448  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  DEDICATED
-- 결과 2: 00000000ED0ED6F8  401  55086  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  PSEUDO

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 00000000DDD73E90  1622  29  9961  00000000ED0ED6F8

-- 원격 DB 강제 종료 및 재기동
srvctl stop database -d [SERVICE_NAME] -o abort
srvctl start database -d [SERVICE_NAME]

 

[로컬 DB] 결과 확인

-- 트랜잭션 정리를 위해 명시적 COMMIT 수행
COMMIT;

/* [Alert Log 기록]
2026-03-26T15:20:10.115184+09:00
Error 3150 trapped in 2PC on transaction 38.26.40984. Cleaning up.
Error stack returned to user:
ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝
ORA-02063: line가 선행됨 (DEVLINK로 부터)
*/

케이스 4: Dedicated Link + DML 수정

[로컬 DB] 데이터 수정 및 트랜잭션 확인

UPDATE [SCHEMA].[TABLE]@DEVLINK2 SET COL1 = 'DEDICATE_DML' WHERE ROWNUM = 1;

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 000000010AE7F840  35  5  76572  000000011CD62530

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM FROM V$SESSION WHERE SADDR ='000000011CD62530';
-- 결과: 000000011CD62530  877  26990  SYSTEM  [HOSTNAME]  [PROGRAM]

 

[원격 DB] 트랜잭션 상태 확인 및 강제 종료

SELECT SADDR, SID, SERIAL#, USERNAME, MACHINE, PROGRAM, SERVER FROM V$SESSION WHERE USERNAME = '[SCHEMA]';
-- 결과: 00000000EC64F398  2327  45845  [SCHEMA]  [HOSTNAME]  oracle@[HOSTNAME] (TNS V1-V3)  DEDICATED

SELECT ADDR, XIDUSN, XIDSLOT, XIDSQN, SES_ADDR FROM V$TRANSACTION;
-- 결과: 00000000DA282FC0  1378  2  10028  00000000EC64F398

-- 원격 DB 강제 종료 및 재기동
srvctl stop database -d [SERVICE_NAME] -o abort
srvctl start database -d [SERVICE_NAME]

 

[로컬 DB] 결과 확인

-- 트랜잭션 정리를 위해 명시적 COMMIT 수행
COMMIT;

/* [Alert Log 기록]
2026-03-26T15:23:22.759271+09:00
Error 3150 trapped in 2PC on transaction 35.5.76572. Cleaning up.
Error stack returned to user:
ORA-03150: 데이터베이스 링크를 위한 통신 채널의 파일 끝
ORA-02063: line가 선행됨 (DEVLINK2로 부터)
*/

4. 결론 및 분석 요약

  1. 에러 발생 원인: 원격 DB가 종료된 후 로컬 세션이 트랜잭션을 확정(COMMIT)하려고 시도할 때
    연결 단절을 인지하며 ORA-03150이 발생합니다.
  2. 트래핑 로그: alert.log에 남는 Error 3150 trapped in 2PC는 분산 트랜잭션 관리자가 비정상 연결을 감지하고
    해당 트랜잭션을 안전하게 정리(Cleaning up)했다는 증거입니다.
  3. 2PC PENDING 여부: 모든 테스트에서 DBA_2PC_PENDING에 데이터가 남지 않은 이유는 트랜잭션이
    준비(Prepare) 단계에 진입하기 전에 통신이 끊겼기 때문입니다. 이는 수동 복구(Purge)가 필요 없는 상태임을 나타냅니다.