본문 바로가기
■Development■/《Database》

[DB] Oracle Listener 완벽 가이드

by 은스타 2020. 4. 8.
반응형

Oracle Listener 완벽 가이드: 구성부터 관리까지

안녕하세요.

이번 포스팅은 Oracle 데이터베이스 네트워크 구성의 핵심 요소인 Oracle Listener에 대해 상세히 알아보겠습니다. Listener는 클라이언트 애플리케이션과 Oracle 데이터베이스 간 통신을 관리하는 중요한 컴포넌트입니다. 이 글에서는 Oracle Listener의 개념부터 구성, 관리, 문제 해결까지 모든 측면을 포괄적으로 다룹니다.


목차

  1. Oracle Listener 개요
  2. Listener 구조와 작동 원리
  3. Listener 설치 및 기본 구성
  4. Listener.ora 파일 구성
  5. Listener 관리 명령어(LSNRCTL)
  6. 다중 Listener 구성
  7. Listener 보안 설정
  8. Listener 로그 분석
  9. 성능 모니터링 및 튜닝
  10. 일반적인 오류와 문제 해결
  11. Oracle 버전별 Listener 변화
  12. 자주 묻는 질문(FAQ)

 

#1. Oracle Listener 개요

Oracle Listener는 클라이언트 요청을 대기하고 이를 적절한 데이터베이스 인스턴스로 라우팅하는 Oracle Net Services의 핵심 구성 요소입니다.

Listener의 주요 기능:

  • 연결 중재: 클라이언트 요청을 데이터베이스 서버에 연결
  • 서비스 등록 관리: 사용 가능한 데이터베이스 서비스 정보 유지
  • 로드 밸런싱: 여러 인스턴스 간 연결 분산(RAC 환경)
  • 연결 집중화: 데이터베이스 리소스 효율적 사용
  • 투명한 애플리케이션 페일오버: 고가용성 지원

Listener가 중요한 이유:

Listener 없이는 클라이언트가 Oracle 데이터베이스에 접속할 수 없습니다. 데이터베이스는 정상적으로 실행 중이어도 Listener가 작동하지 않으면 원격 접속이 불가능합니다.

 

#2. Listener 구조와 작동 원리

기본 구조

Oracle Listener는 운영체제 레벨에서 실행되는 프로세스이며, 보통 tnslsnr이라는 이름으로 실행됩니다. 이 프로세스는 특정 TCP/IP 포트(기본값 1521)에서 클라이언트 연결 요청을 대기합니다.

연결 설정 과정

  1. 클라이언트 요청: 클라이언트가 접속 정보(TNS 별칭)를 사용하여 연결 요청
  2. Listener 수신: Listener가 클라이언트 요청을 수신하고 분석
  3. 서비스 확인: 요청된 서비스 이름에 해당하는 데이터베이스 인스턴스 확인
  4. 연결 설정: 클라이언트와 데이터베이스 인스턴스 간 직접 연결 설정
  5. Listener 역할 종료: 연결이 설정되면 Listener는 해당 세션에서 역할 종료 (연결 자체는 유지)

서비스 등록 방식

Oracle 데이터베이스는 두 가지 방식으로 Listener에 자신의 서비스를 등록합니다:

  1. 정적 등록: listener.ora 파일에 SID_LIST 섹션을 통해 수동 구성
  2. 동적 등록: PMON(Process Monitor) 프로세스가 자동으로 Listener에 서비스 정보 등록

 

#3. Listener 설치 및 기본 구성

설치 확인

Oracle 데이터베이스를 설치하면 Listener도 함께 설치됩니다. 설치 여부는 다음 명령으로 확인할 수 있습니다:

# Unix/Linux
ps -ef | grep tnslsnr

# Windows
tasklist | findstr tnslsnr

기본 Listener 생성

Oracle 설치 중 Listener를 구성하지 않았다면 다음과 같이 새로 생성할 수 있습니다:

# Oracle Net Configuration Assistant 실행
netca

또는 직접 명령줄에서:

# 기본 포트(1521)에 Listener 생성
lsnrctl start

기본 환경 변수 설정

Listener 관리를 위한 필수 환경 변수:

# Unix/Linux
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin

# Windows
set ORACLE_HOME=C:\app\oracle\product\19.0.0\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
set TNS_ADMIN=%ORACLE_HOME%\network\admin

 

#4. Listener.ora 파일 구성

listener.ora 파일은 Listener의 구성 정보를 담고 있는 텍스트 파일입니다. 기본 위치는 $ORACLE_HOME/network/admin 또는 $TNS_ADMIN 디렉토리입니다.

기본 listener.ora 파일 예제

# 기본 Listener 구성
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.example.com)(PORT = 1521))
    )
  )

# 정적 서비스 등록
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl.example.com)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

# 로깅 및 추적 설정
LOGGING_listener = ON
TRACE_LEVEL_listener = OFF

주요 파라미터 설명

  1. ADDRESS: Listener가 대기할 프로토콜, 호스트, 포트 지정
  2. SID_LIST: 정적으로 등록할 데이터베이스 서비스 목록
  3. GLOBAL_DBNAME: 데이터베이스의 전역 이름
  4. ORACLE_HOME: 데이터베이스 홈 디렉토리
  5. SID_NAME: 시스템 식별자(System Identifier)
  6. LOGGING: 로그 생성 여부(ON/OFF)
  7. TRACE_LEVEL: 추적 수준(OFF, USER, ADMIN, SUPPORT)

고급 구성 옵션

# 고급 Listener 구성 예제
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.example.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
    )
  )

# 관리자 접근 제한
PASSWORDS_listener = oracle

# 연결 속도 제한
CONNECTION_RATE_listener = 10

# 유휴 시간 제한(분)
INBOUND_CONNECT_TIMEOUT_listener = 60

 

#5. Listener 관리 명령어(LSNRCTL)

LSNRCTL은 Oracle Listener 관리를 위한 명령줄 도구입니다. 다음은 주요 명령어입니다:

기본 명령어

# Listener 상태 확인
lsnrctl status

# Listener 시작
lsnrctl start

# Listener 중지
lsnrctl stop

# 설정 다시 로드
lsnrctl reload

# 서비스 목록 표시
lsnrctl services

# 버전 정보 표시
lsnrctl version

# 현재 연결 수 확인
lsnrctl show current_listener

대화형 모드 사용

# 대화형 모드 시작
lsnrctl

# 프롬프트에서 명령 입력
LSNRCTL> start
LSNRCTL> status
LSNRCTL> stop
LSNRCTL> exit

여러 Listener 관리

# 특정 Listener 지정
lsnrctl status LISTENER_CUSTOM

# 모든 Listener 확인
lsnrctl status -all

 

#6. 다중 Listener 구성

여러 Listener를 구성하면 다양한 네트워크 요구사항을 충족하거나 성능을 개선할 수 있습니다.

추가 Listener 구성 예제

# listener.ora 파일에 추가 Listener 정의
LISTENER_HR =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = myhost.example.com)(PORT = 1522))
    )
  )

SID_LIST_LISTENER_HR =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = hrdb.example.com)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = hrdb)
    )
  )

다중 Listener 관리

# HR Listener 시작
lsnrctl start LISTENER_HR

# HR Listener 상태 확인
lsnrctl status LISTENER_HR

# HR Listener 중지
lsnrctl stop LISTENER_HR

다중 Listener 사용 시나리오

  1. 여러 데이터베이스 버전 지원: 다른 Oracle 버전용 별도 Listener
  2. 보안 분리: DMZ와 내부 네트워크용 별도 Listener
  3. 성능 최적화: 특정 애플리케이션 전용 Listener
  4. 부하 분산: 여러 Listener로 부하 분산(RAC 환경)

 

#7. Listener 보안 설정

Oracle Listener는 데이터베이스 연결의 첫 관문이므로 보안이 매우 중요합니다.

관리자 액세스 제한

# listener.ora에 암호 설정
PASSWORDS_LISTENER = oracle

# 설정 후 암호 변경
lsnrctl
LSNRCTL> set password
Password: (입력)
The command completed successfully
LSNRCTL> save_config

유효한 노드 제한

# TCP.VALIDNODE_CHECKING 활성화
TCP.VALIDNODE_CHECKING = YES

# 허용 노드 지정
TCP.INVITED_NODES = (192.168.1.100192.168.1.101, 192.168.1.102)

# 또는 거부 노드 지정
TCP.EXCLUDED_NODES = (192.168.2.100, 192.168.2.0/24)

서비스 등록 제한

# 동적 등록 제한
DYNAMIC_REGISTRATION_listener = OFF

로깅 및 감사 설정

# 상세 로깅 활성화
LOGGING_listener ON
TRACE_LEVEL_listener = ADMIN
TRACE_DIRECTORY_listener = /u01/app/oracle/diag/tnslsnr
TRACE_FILE_listener = listener

 

#8. Listener 로그 분석

Listener 로그는 연결 문제 진단에 중요한 정보를 제공합니다.

로그 위치

# 기본 로그 위치 (Oracle 11g 이상)
$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener/trace/listener.log

# 이전 버전
$ORACLE_HOME/network/log/listener.log

주요 로그 항목

  1. 시작 및 중지 메시지: Listener 시작/중지 시간
  2. 서비스 등록 정보: 데이터베이스 서비스 등록/등록 해제
  3. 연결 요청: 클라이언트 연결 시도
  4. 오류 메시지: 연결 실패 및 기타 오류
  5. 구성 변경: Listener 구성 변경 사항

로그 분석 예제

# 시작 메시지
15-MAR-2025 08:12:34 * (CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGRAM=sqlplus)(HOST=client1)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.100)(PORT=53922)) * establish * orcl * 0

# 오류 메시지
15-MAR-2025 08:15:45 * TNS-12514: TNS:listener does not currently know of service requested in connect descriptor

유용한 로그 분석 명령어

# 특정 IP의 연결 시도 확인
grep "HOST=192.168.1.100" listener.log

# 특정 서비스에 대한 연결 확인
grep "SERVICE_NAME=orcl" listener.log

# 오류 메시지만 확인
grep "TNS-" listener.log

 

#9. 성능 모니터링 및 튜닝

Listener 성능 최적화는 전체 데이터베이스 성능에 영향을 미칩니다.

연결 상태 모니터링

# 현재 연결 수 확인
lsnrctl status | grep "Established"

# 자세한 서비스 정보
lsnrctl services

일반적인 튜닝 파라미터

# 연결 비율 제한 (초당 최대 연결 수)
CONNECTION_RATE_listener = 30

# 인바운드 연결 타임아웃 (초)
INBOUND_CONNECT_TIMEOUT_listener = 120

# 세션 데이터 단위 (바이트)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60

RAC 환경에서의 Listener 튜닝

# 로드 밸런싱 목표 설정
listener.ora:
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac1.example.com)(PORT = 1521))
    (LOAD_BALANCE = ON)
  )

# SCAN Listener 구성 (11g R2 이상)
srvctl config scan
srvctl status scan

 

#10. 일반적인 오류와 문제 해결

Oracle Listener 관련 일반적인 오류와 해결 방법을 알아보겠습니다.

TNS-12541: TNS:no listener

문제: Listener가 실행되지 않음
해결:
1. Listener 상태 확인: lsnrctl status
2. 필요시 시작: lsnrctl start
3. 호스트/포트 설정 확인

TNS-12514: TNS:listener does not currently know of service requested

문제: 요청한 서비스가 Listener에 등록되지 않음
해결:
1. 서비스 등록 확인: lsnrctl services
2. 데이터베이스 실행 중인지 확인
3. 정적 등록 추가 또는 동적 등록 오류 확인
4. tnsnames.ora의 서비스 이름 확인

TNS-12535: TNS:operation timed out

문제: 연결 시간 초과
해결:
1. 네트워크 연결 확인
2. 방화벽 설정 확인
3. 타임아웃 설정 늘리기: INBOUND_CONNECT_TIMEOUT_listener = 240

TNS-12547: TNS:lost contact

문제: 연결 중 연결 끊김
해결:
1. 네트워크 안정성 확인
2. 클라이언트/서버 네트워크 설정 확인
3. SQLNET.INBOUND_CONNECT_TIMEOUT, SQLNET.OUTBOUND_CONNECT_TIMEOUT 설정 확인

ORA-12516: TNS:listener could not find available handler for requested type of server

문제: 최대 프로세스 수 초과
해결:
1. 프로세스 파라미터 확인: show parameter processes
2. 필요시 증가: alter system set processes=300 scope=spfile;
3. 데이터베이스 재시작

 

#11. Oracle 버전별 Listener 변화

Oracle 버전에 따른 Listener의 주요 변화를 살펴보겠습니다.

Oracle 9i

  • 기본 TCP 프로토콜 지원 강화
  • IPC 프로토콜 개선
  • 기본 보안 기능 도입

Oracle 10g

  • 자동 서비스 등록 기능 개선
  • 동적 서비스 등록이 기본값으로 설정
  • 클라이언트 연결 로드 밸런싱 개선

Oracle 11g

  • SCAN(Single Client Access Name) Listener 도입(RAC)
  • 다중 엔드포인트 지원 강화
  • 진단 기능 향상
  • ADR(Automatic Diagnostic Repository) 통합

Oracle 12c

  • 멀티테넌트 아키텍처(PDB/CDB) 지원
  • 플러그형 데이터베이스 서비스 등록
  • 향상된 보안 기능(TLS 1.2 지원)

Oracle 19c

  • SCAN 기능 강화
  • 네트워크 암호화 기본 설정 강화
  • 자동 진단 기능 개선
  • TLS 1.3 지원

Oracle 21c

  • 서비스 탐색 기능 개선
  • 중앙 집중식 Listener 관리
  • 보안 기능 강화(암호화, 인증)
  • 클라우드 통합 기능 개선

 

#12. 자주 묻는 질문(FAQ)

Q1: Listener가 없어도 데이터베이스에 접속할 수 있나요?

A: 로컬 접속(localhost)은 Listener 없이도 가능합니다. 'bequeath' 연결이라고 하며, 원격 접속에만 Listener가 필요합니다.

Q2: Listener 암호를 잊어버렸습니다. 어떻게 복구할 수 있나요?

A: listener.ora 파일에서 PASSWORDS_LISTENER 항목을 제거하고 Listener를 재시작하면 암호가 초기화됩니다. 그 후 새 암호를 설정할 수 있습니다.

Q3: 기본 Listener 포트를 변경하려면 어떻게 해야 하나요?

A:

  1. listener.ora 파일에서 PORT 값 변경
  2. Listener 재시작: lsnrctl stop 후 lsnrctl start
  3. tnsnames.ora 파일의 해당 포트도 함께 변경

Q4: 여러 Oracle 홈 환경에서 Listener를 관리하는 방법은?

A:

  1. 각 Oracle 홈마다 별도의 Listener 이름과 포트 사용
  2. 환경 변수 ORACLE_HOME을 적절히 설정하고 관리
  3. TNS_ADMIN 환경 변수를 사용하여 구성 파일 위치 지정

Q5: RAC 환경에서 SCAN Listener와 일반 Listener의 차이점은?

A:

  • 일반 Listener: 각 노드의 특정 IP와 포트에서 대기
  • SCAN Listener: 클러스터 전체의 가상 IP(SCAN IP)에서 대기
  • SCAN Listener는 클라이언트가 클러스터의 특정 노드가 아닌 클러스터 자체에 연결할 수 있게 함
  • 부하 분산과 고가용성을 제공

Q6: 데이터베이스가 Listener에 등록되지 않는 문제의 원인은?

A: 주요 원인은 다음과 같습니다:

  1. LOCAL_LISTENER 파라미터 미설정 또는 잘못된 설정
  2. PMON 프로세스 문제
  3. listener.ora와 tnsnames.ora 파일의 불일치
  4. 네트워크/방화벽 문제

해결 방법:

-- LOCAL_LISTENER 설정 확인 및 수정
SHOW PARAMETER LOCAL_LISTENER
ALTER SYSTEM SET LOCAL_LISTENER='LISTENER_ALIAS' SCOPE=BOTH;
ALTER SYSTEM REGISTER;

결론

Oracle Listener는 클라이언트와 데이터베이스 간의 중요한 통신 매개체입니다. 올바른 설정과 관리는 데이터베이스 환경의 안정성, 보안 및 성능에 직접적인 영향을 미칩니다.

이 글에서는 Oracle Listener의 기본 개념부터 구성, 관리, 문제 해결까지 전반적인 내용을 다루었습니다. Listener 관리는 DBA의 일상적인 업무 중 하나이므로, 이러한 지식은 Oracle 데이터베이스 환경을 효과적으로 운영하는 데 필수적입니다.

최신 Oracle 버전에서는 자동 등록 및 관리 기능이 향상되었지만, 기본 원리를 이해하고 문제 상황에 대응할 수 있는 능력은 여전히 중요합니다. 특히 엔터프라이즈 환경에서는 다중 Listener 구성, 보안 설정, 성능 최적화 등의 고급 주제에 대한 이해가 필요합니다.

긴 글 읽어주셔서 감사합니다.

끝.

반응형