2026년 09월 08일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12168 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12168 TNS: Unable to contact LDAP Directory Server 는?
ORA-12168 에러는 Oracle Net Services가 LDAP(Lightweight Directory Access Protocol) 디렉토리 서버에 접속을 시도했지만 연결에 실패했을 때 발생하는 오류입니다. 주로 Oracle의 네이밍 방식이 LDAP으로 설정되어 있을 때, OID(Oracle Internet Directory) 또는 MS Active Directory와 같은 디렉토리 서버에 도달할 수 없는 상황에서 나타납니다. 이 에러는 TNS 연결 설정 파일인 sqlnet.ora의 NAMES.DIRECTORY_PATH 파라미터에 LDAP이 포함된 경우, 유효한 LDAP 서버가 없거나 네트워크 문제가 있을 때 발생합니다.
주요 발생 원인
1. sqlnet.ora의 NAMES.DIRECTORY_PATH에 LDAP 설정이 잘못되어 있거나 불필요하게 포함된 경우
가장 흔한 원인으로, sqlnet.ora 파일에 NAMES.DIRECTORY_PATH = (LDAP, TNSNAMES, EZCONNECT) 형태로 LDAP이 포함되어 있지만 실제 LDAP 서버가 존재하지 않거나 접근 불가능한 상태일 때 발생합니다. Oracle은 NAMES.DIRECTORY_PATH에 나열된 순서대로 이름 해석을 시도하기 때문에, LDAP이 첫 번째로 지정되어 있으면 LDAP 서버 연결을 먼저 시도하다가 실패하면 이 에러가 발생합니다. 실무에서는 초기 설치 시 기본값으로 LDAP이 포함된 경우 또는 타 환경에서 복사한 설정 파일이 원인이 되는 경우가 많습니다.
2. ldap.ora 파일의 LDAP 서버 정보가 잘못 설정된 경우
ldap.ora 파일은 LDAP 디렉토리 서버의 호스트명, 포트, 도메인 정보를 정의하는 파일입니다. 이 파일에 기재된 DIRECTORY_SERVERS 값이 잘못된 IP, 잘못된 포트(기본 포트는 389), 또는 존재하지 않는 호스트명을 가리키고 있을 경우 ORA-12168이 발생합니다. 또한 ldap.ora 파일 자체가 $ORACLE_HOME/network/admin 경로에 존재하지 않거나, TNS_ADMIN 환경 변수가 다른 경로를 가리키고 있어 파일을 찾지 못하는 경우도 해당됩니다.
3. 네트워크 방화벽 또는 LDAP 서버 자체의 장애
LDAP 서버의 호스트명과 포트 설정이 올바르더라도, 방화벽 규칙에 의해 LDAP 포트(389 또는 636 for SSL)가 차단된 경우 연결이 불가능합니다. OID 서비스가 중단되었거나, LDAP 서버가 과부하 상태이거나, DNS 해석이 실패하는 경우에도 동일한 에러가 발생합니다. 특히 클라우드 환경이나 VPN 환경에서 네트워크 정책 변경 후에 이 문제가 빈번하게 나타납니다.
해결 방법
해결책 1: sqlnet.ora에서 LDAP 제거 또는 순서 변경
LDAP 디렉토리 서버를 실제로 사용하지 않는 환경이라면, sqlnet.ora에서 LDAP 항목을 제거하는 것이 가장 빠른 해결책입니다.
현재 설정 확인:
-- sqlnet.ora 파일 위치 확인 (SQL*Plus에서 실행)
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'tns_admin';
-- 현재 Oracle Home 확인
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB_NAME FROM DUAL;
$ORACLE_HOME/network/admin/sqlnet.ora 파일을 열어 아래와 같이 수정합니다:
-- 수정 전 (문제 있는 설정)
-- NAMES.DIRECTORY_PATH = (LDAP, TNSNAMES, EZCONNECT)
-- 수정 후 (LDAP 제거)
-- NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
변경 후 TNS 연결 테스트:
-- tnsping 결과 확인 후 실제 접속 테스트
-- SQL*Plus에서 연결 확인
CONNECT sys/password@tns_alias AS SYSDBA;
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
해결책 2: ldap.ora 파일 수정
LDAP을 실제로 사용하는 환경이라면 ldap.ora 파일의 내용을 정확히 수정해야 합니다.
-- ldap.ora 파일 샘플 (올바른 형식)
-- DIRECTORY_SERVERS = (ldap-server.example.com:389:636)
-- DEFAULT_ADMIN_CONTEXT = "dc=example,dc=com"
-- DIRECTORY_SERVER_TYPE = OID
-- LDAP 연결 테스트를 위한 SQL (OID 메타데이터 확인)
SELECT * FROM V$OPTION WHERE PARAMETER = 'Oracle Internet Directory';
LDAP 서버 연결 가능 여부를 OS 레벨에서 먼저 확인:
-- 아래는 OS 명령어이나 DBA 진단 시 참고
-- telnet ldap-server.example.com 389
-- ldapsearch -h ldap-server.example.com -p 389 -b "dc=example,dc=com"
-- Oracle DB에서 네트워크 관련 파라미터 확인
SELECT NAME, VALUE FROM V$PARAMETER
WHERE NAME IN ('local_listener', 'remote_listener')
ORDER BY NAME;
해결책 3: TNS_ADMIN 환경 변수 및 파일 경로 확인
-- 현재 TNS_ADMIN 경로 확인
-- SQL*Plus 또는 OS에서 확인
SELECT SYS_CONTEXT('USERENV', 'SERVER_HOST') AS SERVER_HOST FROM DUAL;
-- Oracle Net 설정 디렉토리 내 파일 목록 확인용 쿼리
-- (DBA_DIRECTORIES를 활용한 간접 확인)
SELECT DIRECTORY_NAME, DIRECTORY_PATH
FROM DBA_DIRECTORIES
WHERE DIRECTORY_NAME LIKE '%ADMIN%'
ORDER BY DIRECTORY_NAME;
-- sqlnet.ora, ldap.ora, tnsnames.ora 유효성 체크를 위한
-- Oracle Net Manager 실행 여부 확인 (파라미터 수준)
SHOW PARAMETER LOCAL_LISTENER;
해결책 4: LDAP 서버 장애 시 임시 우회
-- 임시로 EZConnect 방식을 사용하는 연결 테스트
-- CONNECT username/password@hostname:port/service_name
-- 예시:
-- CONNECT scott/tiger@192.168.1.100:1521/ORCL
-- DB Link가 LDAP 방식을 사용하는 경우 수정
SELECT DB_LINK, HOST, USERNAME FROM DBA_DB_LINKS ORDER BY DB_LINK;
-- 특정 DB Link 재생성 (LDAP 없이 tnsnames 방식으로)
-- DROP DATABASE LINK old_link;
-- CREATE DATABASE LINK new_link
-- CONNECT TO remote_user IDENTIFIED BY password
-- USING 'TNSNAMES_ENTRY';
-- 현재 세션의 연결 정보 확인
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS SERVICE_NAME,
SYS_CONTEXT('USERENV', 'SESSION_USER') AS SESSION_USER,
SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS IP_ADDRESS
FROM DUAL;
예방 방법
1. 표준화된 sqlnet.ora 템플릿 관리 및 정기 검토
모든 Oracle 클라이언트와 서버 환경에서 사용하는 sqlnet.ora 파일을 Git 등의 형상 관리 시스템으로 관리하고, LDAP과 같이 외부 서비스에 의존하는 설정은 해당 서비스의 가용성 점검과 연계하여 주기적으로 검토해야 합니다. 실제 LDAP을 사용하지 않는 환경에서는 NAMES.DIRECTORY_PATH에서 LDAP을 제거하고, 사용하는 환경에서는 LDAP 서버의 헬스체크 모니터링을 반드시 구성하여 서버 장애를 조기에 탐지할 수 있도록 해야 합니다.
-- 정기 점검용: Oracle Net 관련 파라미터 전체 조회
SELECT NAME, VALUE, DESCRIPTION
FROM V$PARAMETER
WHERE NAME LIKE '%listener%' OR NAME LIKE '%tns%'
ORDER BY NAME;
2. LDAP 서버 가용성 모니터링 자동화
OID 또는 외부 LDAP 서버를 실제로 사용하는 환경이라면, cron job 또는 Oracle Enterprise Manager(OEM)를 활용한 LDAP 포트 모니터링을 구성하여 장애 발생 시 즉각적인 알림을 받을 수 있도록 합니다. LDAP 서버 장애가 Oracle 연결 전반에 영향을 주지 않도록 NAMES.DIRECTORY_PATH에서 LDAP의 우선순위를 낮추거나, failover 가능한 LDAP 서버를 ldap.ora의 DIRECTORY_SERVERS에 복수로 등록하는 것이 좋습니다.
-- LDAP 관련 Oracle Net 이벤트 로그 확인 (alert log 조회)
SELECT ORIGINATING_TIMESTAMP, MESSAGE_TEXT
FROM V$DIAG_ALERT_EXT
WHERE MESSAGE_TEXT LIKE '%LDAP%' OR MESSAGE_TEXT LIKE '%ORA-12168%'
ORDER BY ORIGINATING_TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;
관련 에러
- ORA-12154: TNS:could not resolve the connect identifier specified — LDAP 이름 해석 실패 후 tnsnames.ora에서도 이름을 찾지 못할 때 연속으로 발생할 수 있습니다.
- ORA-12170: TNS:Connect timeout occurred — LDAP 서버에 연결을 시도했으나 응답 없이 타임아웃이 발생한 경우.
- ORA-12224: TNS:no listener — LDAP 해석 후 대상 DB의 리스너를 찾지 못한 경우.
- ORA-12533: TNS:illegal ADDRESS parameters — ldap.ora의 서버 주소 형식이 잘못된 경우 함께 발생할 수 있습니다.
- ORA-12545: Connect failed because target host or object does not exist — LDAP에서 반환된 호스트 정보가 실제로 존재하지 않을 때 발생합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.