2026년 09월 14일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12560 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12560 TNS: protocol adapter error 는?
ORA-12560은 Oracle 클라이언트가 데이터베이스 서버와 통신하기 위한 네트워크 프로토콜 어댑터를 초기화하거나 연결하는 과정에서 실패할 때 발생하는 에러입니다. 주로 Oracle 서비스가 중지되어 있거나, 환경 변수가 잘못 설정되어 있거나, 리스너(Listener)가 정상적으로 작동하지 않을 때 발생합니다. DBA라면 데이터베이스 서버를 재기동하거나 새로운 환경에 Oracle을 설치한 직후 이 에러를 마주치는 경우가 매우 빈번하며, 빠르게 원인을 파악하고 해결하는 능력이 필요합니다.
주요 발생 원인
1. Oracle 서비스(OracleService)가 중지된 경우
가장 흔하고 치명적인 원인입니다. Windows 환경에서는 OracleServiceSID 서비스가, Linux/Unix 환경에서는 Oracle 백그라운드 프로세스(PMON, SMON 등)가 실행 중이지 않으면 클라이언트는 어떤 방법으로도 데이터베이스에 접속할 수 없습니다. 서버 재부팅 이후 자동 시작 설정이 누락되어 있는 경우에도 이 문제가 반복적으로 발생합니다.
2. ORACLE_SID 또는 ORACLE_HOME 환경 변수 미설정 혹은 오설정
Oracle은 클라이언트 또는 서버 측에서 ORACLE_SID, ORACLE_HOME 환경 변수를 참조하여 접속할 인스턴스를 식별합니다. 이 값이 비어 있거나 잘못된 경로/SID를 가리키고 있으면 프로토콜 어댑터가 초기화 대상을 찾지 못해 ORA-12560이 발생합니다. 특히 여러 Oracle 버전이 혼재하는 환경에서는 PATH 충돌로 인해 이 문제가 더욱 자주 나타납니다.
3. Oracle Listener가 기동되지 않았거나 잘못된 설정을 가진 경우
원격 클라이언트가 Oracle 데이터베이스에 접속할 때는 반드시 Listener가 중개 역할을 해야 합니다. listener.ora 파일의 HOST 또는 PORT 설정이 실제 서버 환경과 맞지 않거나, Listener 프로세스 자체가 중지된 경우에는 TNS 프로토콜 어댑터 에러가 발생합니다. 방화벽이 1521 포트를 차단하고 있는 경우도 동일한 증상을 유발합니다.
해결 방법
원인 1 해결: Oracle 서비스 기동
Windows 환경:
서비스 관리자(services.msc)에서 OracleServiceSID를 찾아 시작하거나, 명령 프롬프트에서 아래 명령을 실행합니다.
-- Windows CMD (관리자 권한 필요)
net start OracleServiceORCL
-- 서비스 상태 확인
sc query OracleServiceORCL
Linux/Unix 환경:
-- Oracle 유저로 전환 후 DB 기동
su - oracle
sqlplus / as sysdba
-- 인스턴스 상태 확인
SELECT STATUS FROM V$INSTANCE;
-- DB가 내려가 있을 경우 기동
STARTUP;
-- 현재 접속된 세션 확인
SELECT SID, SERIAL#, USERNAME, STATUS FROM V$SESSION WHERE USERNAME IS NOT NULL;
원인 2 해결: 환경 변수 설정
Linux/Unix 환경에서 환경 변수 확인 및 설정:
-- Shell에서 현재 환경 변수 확인
-- (SQL이 아닌 OS 명령어이지만 DBA가 반드시 숙지해야 함)
-- echo $ORACLE_SID
-- echo $ORACLE_HOME
-- .bash_profile 또는 .bashrc에 아래 설정 추가
-- export ORACLE_BASE=/u01/app/oracle
-- export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
-- export ORACLE_SID=ORCL
-- export PATH=$ORACLE_HOME/bin:$PATH
-- 환경 변수 적용 후 접속 테스트
-- sqlplus / as sysdba
-- DB에 접속 후 현재 인스턴스 이름 확인
SELECT INSTANCE_NAME, HOST_NAME, VERSION, STATUS
FROM V$INSTANCE;
Windows 환경에서 레지스트리 확인:
-- Windows CMD에서 Oracle 관련 환경 변수 확인
-- set ORACLE_SID
-- set ORACLE_HOME
-- sqlplus 접속 테스트 (로컬 IPC 방식)
-- sqlplus sys/password@ORCL as sysdba
-- tnsping으로 네트워크 연결 테스트
-- tnsping ORCL
-- TNS 연결 정보 확인 (DB 접속 후)
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB_NAME,
SYS_CONTEXT('USERENV', 'SERVER_HOST') AS SERVER_HOST,
SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS CLIENT_IP
FROM DUAL;
원인 3 해결: Listener 기동 및 설정 확인
-- OS에서 Listener 상태 확인 (oracle 유저)
-- lsnrctl status
-- Listener 기동
-- lsnrctl start
-- Listener 재기동
-- lsnrctl stop
-- lsnrctl start
-- Listener 기동 후 DB 내에서 서비스 등록 확인
SELECT NAME, NETWORK_NAME, CREATION_DATE
FROM V$SERVICES
ORDER BY NAME;
-- 동적 서비스 등록 강제 실행 (Listener에 즉시 등록)
ALTER SYSTEM REGISTER;
-- tnsnames.ora 설정 확인을 위한 tnsping 테스트
-- tnsping ORCL 10
-- 현재 Listener에 등록된 서비스 확인
-- lsnrctl services LISTENER
추가 진단 쿼리
-- Alert Log 경로 확인 (에러 추적에 필수)
SELECT VALUE
FROM V$DIAG_INFO
WHERE NAME = 'Diag Trace';
-- 데이터베이스 파라미터 중 네트워크 관련 확인
SELECT NAME, VALUE
FROM V$PARAMETER
WHERE NAME IN ('local_listener', 'remote_listener', 'service_names', 'db_name', 'instance_name');
-- 리스너 포트 확인 (DB 내에서)
SELECT DBMS_XDB_CONFIG.GETHTTPPORT() AS HTTP_PORT FROM DUAL;
예방 방법
1. Oracle 서비스 자동 시작 설정 및 모니터링 스크립트 구축
서버 재부팅 이후에도 Oracle 서비스와 Listener가 자동으로 기동되도록 설정해야 합니다. Windows에서는 서비스의 시작 유형을 ‘자동’으로, Linux에서는 /etc/oratab 파일에서 해당 SID의 마지막 항목을 Y로 설정하고 dbstart 스크립트를 /etc/rc.local 또는 systemd 서비스로 등록합니다. 추가적으로 Zabbix, OEM(Oracle Enterprise Manager), 또는 Shell 크론잡을 이용한 주기적인 인스턴스 상태 모니터링 체계를 갖추면 장애 발생 전에 선제적으로 대응할 수 있습니다.
-- 모니터링용 헬스체크 쿼리 (크론잡에서 주기적으로 실행)
SELECT INSTANCE_NAME,
HOST_NAME,
STATUS,
DATABASE_STATUS,
TO_CHAR(STARTUP_TIME, 'YYYY-MM-DD HH24:MI:SS') AS STARTUP_TIME
FROM V$INSTANCE;
2. 표준화된 환경 변수 관리 및 TNS 설정 문서화
환경 변수 파일(.bash_profile, .bashrc)과 tnsnames.ora, listener.ora 파일을 Git과 같은 버전 관리 시스템으로 관리하고, 변경 이력을 추적합니다. 신규 DBA나 개발자가 합류하더라도 표준 설정 가이드를 따르면 ORA-12560과 같은 설정 관련 에러를 사전에 방지할 수 있습니다. 또한 정기적인 접속 테스트 자동화(tnsping, sqlplus 연결 테스트)를 통해 설정 이상을 조기에 탐지하는 체계를 운영하는 것이 중요합니다.
관련 에러
- ORA-12541: TNS: no listener — Listener가 아예 없거나 기동되지 않은 경우 발생하며, ORA-12560과 증상이 유사합니다.
- ORA-12170: TNS: Connect timeout occurred — 네트워크 지연 또는 방화벽으로 인해 연결 시도 자체가 타임아웃되는 경우 발생합니다.
- ORA-01034: ORACLE not available — 인스턴스는 기동되었으나 데이터베이스가 OPEN 상태가 아닐 때 발생합니다.
- ORA-27101: shared memory realm does not exist — SGA가 초기화되지 않은 상태에서 접속을 시도할 때 나타나며, ORA-12560과 함께 자주 발생합니다.
- ORA-12154: TNS: could not resolve the connect identifier specified — tnsnames.ora에 연결 식별자가 없거나 잘못 설정된 경우 발생합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.