데이터베이스 연구실.log

리스너와 서비스 등록

리스너와 Oracle Net 설정 파일, READY와 UNKNOWN 등록 상태 및 리스너 중단 시 접속 영향

LISTENERlistener.oratnsnames.orasqlnet.oralsnrctl동적 서비스 등록정적 서비스 등록LOCAL_LISTENERORA-12541

#핵심 요약

리스너는 로컬이 아닌 모든 접속이 인스턴스로 들어가는 관문임
리스너 하나가 여러 인스턴스와 많은 접속을 처리함

기본 리스너 이름은 LISTENER, 기본 주소는 TCP 1521임
listener.ora의 항목이 모두 기본값을 가지므로 파일이 없어도 lsnrctl start가 됨

인스턴스가 스스로 리스너에 서비스를 알리는 동적 등록은 lsnrctl status에서 READY로, listener.ora의 SID_LIST에 적은 정적 등록은 UNKNOWN으로 보임

sqlplus / as sysdba 같은 로컬 운영체제 인증 접속은 리스너를 거치지 않으므로, 리스너가 멈춰도 로컬 접속은 되고 서비스 이름 경유 원격 접속은 ORA-12541: TNS:no listener로 실패함

#개념과 동작 원리

#Oracle Net 구성 요소와 설정 파일

구성 요소 역할 설정 파일 위치
리스너 접속 요청을 기다렸다가 서버로 넘김 listener.ora 서버
네이밍 방식 접속 식별자(connect identifier)를 접속 기술자(connect descriptor)로 해석하는 규칙 방식에 따라 다름 클라이언트
네트워크 서비스 이름 서비스를 가리키는 이름 tnsnames.ora(로컬 네이밍) 클라이언트
프로필 Oracle Net 기능 설정값 모음 sqlnet.ora 클라이언트와 서버

설정 파일은 기본적으로 $ORACLE_HOME/network/admin에 있음
실습에서는 TNS_ADMIN 환경 변수로 설정 파일 디렉터리를 바꿔 "설정 파일이 없는 상태"를 만드는 실습도 적었음

#구성 도구

도구 관리 기능과 적용 위치
Oracle Net Manager 그 도구가 설치된 호스트의 Oracle 홈만(로컬)
Enterprise Manager Cloud Control 에이전트가 있는 여러 서버의 리스너와 서비스 이름을 중앙에서
Oracle Net Configuration Assistant(netca) 설치 중 자동 실행되지만 설치 뒤에도 다시 실행 가능
lsnrctl 리스너 시작, 중지, 상태 조회

#동적 등록과 정적 등록

비교 동적 서비스 등록 정적 서비스 등록
등록 주체 인스턴스의 백그라운드 프로세스가 주기적으로 리스너에 알림 DBA가 listener.ora에 SID_LIST_<리스너 이름> 작성
listener.ora 필요 필요 없음 필요
lsnrctl status 상태 READY UNKNOWN
리스너가 아는 것 서비스 존재와 현재 가동 상태 설정 파일에 적혀 있다는 사실만

인스턴스가 등록할 리스너를 찾지 못하면 그 서비스는 UNKNOWN이 되는 것이 아니라 목록에서 사라짐

리스너 포트가 1521이 아니어도 상태 표시는 달라지지 않음

동적 등록 대상 리스너 주소는 LOCAL_LISTENER 파라미터로 정함

리스너 포트의 LISTEN 상태와 클라이언트 도달성 점검은 포트와 방화벽에서 다룸

#필수 명령어 또는 SQL

#리스너 상태와 서비스 확인

OS 셸 (oracle 사용자)조회만 함
lsnrctl status
SQL*Plus (SYSDBA, CDB$ROOT)조회만 함
SELECT name, pdb FROM v$services;

결과 해석:

실습 기록: lsnrctl status의 Services Summary에 CDB 서비스, <SID>XDB, PDB 서비스가 모두 READY로 나왔음
동적 등록에서는 PDB GUID 이름의 서비스도 함께 보였음
V$SERVICES에는 CDB 루트의 서비스, SYS$BACKGROUND, SYS$USERS와 PDB별 서비스가 PDB 열과 함께 나왔음

#자동 구성된 설정 파일 확인

OS 셸 (oracle 사용자)조회만 함
ls -l $ORACLE_HOME/network/admin
cat $ORACLE_HOME/network/admin/sqlnet.ora

결과 해석:

실습 예시의 sqlnet.ora는 NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)였음
접속 식별자를 해석할 때 로컬 네이밍과 Easy Connect를 순서대로 시도하라는 설정임

tnsnames.ora 항목 형식:

파일 (tnsnames.ora)객체 또는 설정을 변경함
<NET_SERVICE_NAME> =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <HOST>)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <SERVICE_NAME>)
    )
  )

결과 해석: 개별 실행 출력은 기재 없음

#정적 등록으로 바꾸고 다시 동적 등록으로

실습에서는 기존 listener.ora를 다른 이름으로 옮겨 두고, 아래처럼 SID_LIST_LISTENER가 있는 새 파일을 만든 뒤 리스너를 다시 시작했음

파일 (listener.ora)객체 또는 설정을 변경함
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <HOST>)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = <CDB_SERVICE>)
      (ORACLE_HOME = <ORACLE_HOME>)
      (SID_NAME = <SID>)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = <PDB_SERVICE>)
      (ORACLE_HOME = <ORACLE_HOME>)
      (SID_NAME = <SID>)
    )
  )
OS 셸 (oracle 사용자)인스턴스 또는 서비스 중단이 필요함
lsnrctl stop
lsnrctl start

결과 해석:

실습 기록: 시작 직후 서비스가 모두 UNKNOWN으로 나왔고, PDB 서비스로 원격 접속이 성공했음
원래 파일에는 외부 프로시저용 PLSExtProc 항목도 있었음

다시 원래 파일로 되돌려 리스너를 재시작하자 "리스너는 서비스를 지원하지 않습니다"가 나왔음
그 상태에서 아래를 실행하자 서비스가 READY로 다시 등록됐음

SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
SHOW PARAMETER local_listener
ALTER SYSTEM REGISTER;

결과 해석:

ALTER SYSTEM REGISTER는 다음 주기를 기다리지 않고 바로 리스너에 등록하게 함

#리스너를 멈췄을 때

OS 셸 (oracle 사용자)인스턴스 또는 서비스 중단이 필요함
lsnrctl stop
sqlplus / as sysdba
sqlplus <USERNAME>@<HOST>:1521/<SERVICE_NAME>
lsnrctl start

결과 해석:

실습 기록: 리스너를 멈춘 상태에서 운영체제 인증 접속은 성공하고 V$INSTANCE.STATUS는 OPEN이었음
서비스 이름 경유 접속은 ORA-12541: TNS:no listener로 실패했음
실습에서는 "서버에 로그인해서 확인했더니 정상"이라는 확인이 원격 접속 장애를 놓칠 수 있는 이유라고 적었음

#두 번째 리스너 추가와 등록

실습에서는 netca로 1522 포트의 LISTENER2를 만든 뒤 인스턴스가 두 리스너에 모두 등록되도록 했음

OS 셸 (oracle 사용자)조회만 함
lsnrctl status LISTENER2
SQL*Plus (SYSDBA, CDB$ROOT)객체 또는 설정을 변경함
ALTER SYSTEM SET local_listener =
  '(ADDRESS_LIST=
     (ADDRESS=(PROTOCOL=TCP)(HOST=<HOST>)(PORT=1521))
     (ADDRESS=(PROTOCOL=TCP)(HOST=<HOST>)(PORT=1522)))' SCOPE = BOTH;

ALTER SYSTEM REGISTER;

결과 해석:

실습 기록: 등록 전 LISTENER2는 "서비스를 지원하지 않습니다"였고, 등록 뒤에는 모든 서비스가 READY로 나왔음
정리할 때는 lsnrctl stop LISTENER2 뒤 LOCAL_LISTENER를 1521 주소 하나로 되돌렸음

주의: 한 서버에서 두 번째 리스너를 이름 없이 시작하면 TNS-01106(LISTENER가 이미 실행 중), 이름을 바꿔도 같은 포트를 쓰면 TNS-12542(주소 사용 중)가 남
리스너 이름과 포트를 겹치지 않게 지정해야 함

#사용 조건과 주의사항

리스너 재시작(lsnrctl stop)은 그 리스너를 통한 신규 원격 접속을 막음
실습은 운영 환경 기준이 아님

실습의 listener.ora 없이 기동하는 실습은 리스너를 멈춘 뒤 파일 이름을 바꿔 진행했음
실습 기록에서 파일 없이 LISTENER가 1521로 떴고, 처음에는 서비스가 없다가 동적 등록 뒤 READY 서비스가 나타났음

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기