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

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

이 글에서 다루는 내용

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

ORA-12222 TNS: no support is available for the protocol indicated 는?

ORA-12222 에러는 Oracle Net(TNS) 레이어에서 클라이언트 또는 서버가 연결 요청에 명시된 네트워크 프로토콜을 지원하지 않을 때 발생하는 오류입니다. 즉, tnsnames.ora 또는 listener.ora 파일에 설정된 프로토콜(예: TCP, IPC, NMP 등)이 해당 환경에서 로드되거나 사용 가능한 상태가 아닐 때 이 에러가 트리거됩니다. 주로 잘못된 프로토콜 설정, Oracle 네트워크 어댑터 누락, 혹은 OS 수준의 네트워크 구성 오류로 인해 DBA가 마주치는 실무 에러입니다.


주요 발생 원인

1. tnsnames.ora 또는 listener.ora 파일의 프로토콜 오타 및 잘못된 설정

가장 빈번한 원인으로, 설정 파일 내 PROTOCOL 항목에 잘못된 값(예: TCPP, TCPIP, ip 등)이 기재되거나 대소문자 오류가 발생한 경우입니다. Oracle TNS는 프로토콜 문자열을 엄격히 파싱하기 때문에, 정확히 TCP, IPC, NMP, TCPS 중 하나여야 하며 오탈자가 있으면 즉시 이 에러를 반환합니다. 파일을 수동으로 편집하거나 마이그레이션 스크립트로 자동 생성할 때 자주 발생합니다.

2. Oracle Net 프로토콜 어댑터(Protocol Adapter)가 설치되지 않았거나 손상된 경우

Oracle 클라이언트 또는 서버 소프트웨어를 설치할 때 특정 프로토콜 어댑터(예: Named Pipes Adapter, Bequeath Adapter)가 선택적으로 설치됩니다. 만약 tnsnames.ora에는 NMP(Named Pipes) 프로토콜이 명시되어 있는데 해당 어댑터가 설치되어 있지 않거나, 파일이 손상된 경우 ORA-12222가 발생합니다. 특히 Oracle 소프트웨어를 부분 재설치하거나 패치 적용 후 어댑터 바이너리가 누락되는 사례가 실무에서 종종 목격됩니다.

3. sqlnet.ora의 NAMES.DIRECTORY_PATH 또는 프로토콜 제한 설정 충돌

sqlnet.ora 파일에서 USE_CMAN, NAMES.DIRECTORY_PATH, 또는 SSL_VERSION 등의 파라미터가 잘못 설정된 경우, 특정 프로토콜을 강제로 비활성화하거나 지원하지 않는 방식으로 연결을 시도하게 됩니다. 예를 들어 TCPS(SSL) 프로토콜을 사용하려는데 sqlnet.ora에 SSL 관련 파라미터가 누락된 경우, TNS 레이어는 해당 프로토콜을 처리할 수 없다고 판단하고 ORA-12222를 반환합니다. 보안 강화 목적으로 sqlnet.ora를 수정한 이후 갑자기 이 에러가 발생하는 패턴이 많습니다.


해결 방법

원인 1 해결: tnsnames.ora 및 listener.ora 프로토콜 문자열 검증 및 수정

먼저 현재 설정 파일의 경로를 확인하고 프로토콜 항목을 검토합니다.

-- SQL*Plus에서 TNS 환경 정보 확인
-- (Oracle 19c 이상)
SELECT name, value
FROM v$parameter
WHERE name IN ('local_listener', 'remote_listener', 'service_names', 'db_domain');

다음은 올바른 tnsnames.ora 설정 예시입니다:

-- 잘못된 설정 예시 (에러 발생)
-- ORCL =
--   (DESCRIPTION =
--     (ADDRESS = (PROTOCOL = TCPP)(HOST = myhost)(PORT = 1521))  -- TCPP는 잘못됨
--     (CONNECT_DATA = (SERVICE_NAME = orcl))
--   )

-- 올바른 설정 예시
-- ORCL =
--   (DESCRIPTION =
--     (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521))   -- 반드시 TCP
--     (CONNECT_DATA = (SERVICE_NAME = orcl))
--   )

수정 후 리스너를 재시작하고 상태를 확인합니다:

-- 리스너 상태 확인 (OS 커맨드 후 결과를 DB에서 조회)
-- OS 레벨: lsnrctl status LISTENER
-- OS 레벨: lsnrctl reload LISTENER

-- DB 접속 후 리스너 등록 서비스 확인
SELECT inst_id, name, network_name, creation_date
FROM gv$services
ORDER BY inst_id, name;

원인 2 해결: Oracle Net 프로토콜 어댑터 확인 및 재설치

어댑터 파일의 존재 여부를 OS 레벨에서 확인합니다 (Linux/Unix 기준):

-- Oracle Net 어댑터 로드 상태 간접 확인
-- (tnsping으로 먼저 테스트 후 문제 격리)
-- OS: tnsping ORCL

-- DB 내에서 현재 프로토콜 지원 여부 우회 확인
-- (DBA_REGISTRY에서 네트워크 컴포넌트 상태 점검)
SELECT comp_name, version, status
FROM dba_registry
WHERE comp_name LIKE '%Oracle%Net%'
   OR comp_name LIKE '%XML%'
   OR comp_name LIKE '%JServer%';

Named Pipes를 사용하지 않는 환경이라면, tnsnames.ora에서 NMP 프로토콜 항목을 제거하고 TCP로 대체합니다:

-- 연결 테스트용 최소 TNS Alias (TCP only) 확인 쿼리
-- 아래는 실제 DB 접속 후 현재 세션의 연결 정보를 확인하는 방법
SELECT
    sys_context('USERENV', 'IP_ADDRESS')       AS client_ip,
    sys_context('USERENV', 'NETWORK_PROTOCOL')  AS protocol,
    sys_context('USERENV', 'SERVER_HOST')       AS server_host,
    sys_context('USERENV', 'SERVICE_NAME')      AS service_name
FROM dual;

원인 3 해결: sqlnet.ora 파라미터 검토 및 수정

sqlnet.ora 파일의 주요 파라미터를 확인하고 TCPS 환경을 정비합니다:

-- sqlnet.ora 관련 Oracle 파라미터 DB 측에서 확인
SELECT name, value, description
FROM v$parameter
WHERE name IN (
    'ssl_version',
    'ssl_cipher_suites',
    'wallet_location'
);

-- 현재 DB의 SSL/TLS 설정 확인 (Oracle 12c 이상)
SELECT *
FROM v$encryption_wallet;

TCPS 프로토콜 사용 시 sqlnet.ora에 반드시 포함되어야 하는 설정:

-- sqlnet.ora 올바른 TCPS 설정 예시 (주석으로 표현)
-- WALLET_LOCATION =
--   (SOURCE =
--     (METHOD = FILE)
--     (METHOD_DATA =
--       (DIRECTORY = /oracle/wallet)))
-- SSL_CLIENT_AUTHENTICATION = FALSE
-- SSL_VERSION = 1.2

-- 설정 적용 후 Oracle Wallet 상태 확인 쿼리
SELECT wrl_type, wrl_parameter, status, wallet_type
FROM v$encryption_wallet;

예방 방법

1. TNS 설정 파일 변경 시 반드시 tnsping 및 접속 테스트 수행

tnsnames.ora, listener.ora, sqlnet.ora 파일을 수정한 직후에는 반드시 tnsping [TNS_ALIAS] 명령으로 프로토콜 레이어 연결 가능 여부를 검증하고, 이후 실제 SQL*Plus 접속 테스트(sqlplus user/pass@alias)까지 완료해야 합니다. 또한 운영 환경에 적용하기 전에 형상관리 시스템(Git 등)에 변경 이력을 반드시 남겨 롤백 기준선을 확보하는 것이 Best Practice입니다.

2. Oracle Net Configuration Assistant(NETCA) 및 Oracle Net Manager 활용으로 수동 편집 최소화

tnsnames.oralistener.ora를 텍스트 에디터로 직접 수동 편집하면 오타와 문법 오류가 발생하기 쉽습니다. Oracle에서 공식 제공하는 NETCA(Net Configuration Assistant) 또는 Oracle Net Manager GUI 도구를 사용하면 프로토콜 문자열을 드롭다운에서 선택하므로 오타 가능성이 원천 차단됩니다. 대규모 환경에서는 Ansible이나 Python 스크립트로 표준 템플릿 기반의 자동 배포 파이프라인을 구성하여 인적 오류를 최소화하는 것을 권장합니다.


관련 에러

  • ORA-12154: TNS:could not resolve the connect identifier specified — TNS 별칭 자체를 찾지 못할 때 발생하며, ORA-12222와 함께 tnsnames.ora 설정 문제로 묶여서 나타나는 경우가 많습니다.
  • ORA-12203: TNS:unable to connect to destination — 프로토콜 협상 이후 목적지에 도달하지 못할 때 발생하며, ORA-12222의 후속 에러로 연쇄 발생할 수 있습니다.
  • ORA-12545: Connect failed because target host or object does not exist — 호스트명 또는 포트 오류와 함께 프로토콜 미지원 문제가 복합적으로 얽힐 때 함께 나타납니다.
  • ORA-12560: TNS:protocol adapter error — 로컬 연결 시 IPC 또는 Bequeath 어댑터가 정상 동작하지 않을 때 발생하며, ORA-12222와 원인 구조가 유사합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기