- 출처 / 참고: Oracle Database Net Services Reference (The listener.ora File, The tnsnames.ora File), Oracle Database Net Services Administrator’s Guide (Troubleshooting Oracle Net Services)
명령어:
lsnrctl,tnsping,ss,netstat,curl,iptables,firewall-cmd
키워드: ORA-12541, TNS:no listener, lsnrctl status, listener.ora, tnsnames.ora, 1521 포트, Connection refused, 방화벽
사용처: 원격 애플리케이션 및 클라이언트 툴(DBeaver, SQL Developer, Orange)에서 오라클 DB 접속 불가 장애 진단 및 리스너 복구
실행예제
클라이언트(또는 애플리케이션 서버)에서 데이터베이스 연결 시 ORA-12541: TNS:no listener 오류가 발생했을 때 클라이언트 관점의 연결 테스트와 DB 서버 관점의 리스너 구동 상태 및 1521 포트 개방 여부를 점검합니다.
# 1. 클라이언트 관점: tnsping 도구로 TNS 별칭 및 대상 리스너 도달 가능 여부 테스트
$ tnsping orcl
# TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 15-OCT-2026 10:15:30
# Used parameter files:
# /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/sqlnet.ora
# Used TNSNAMES.ORA entry to resolve name:
# (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))
# TNS-12541: TNS:no listener
# 2. 클라이언트 관점: IP와 포트(1521) 직통 TCP 연결 가능 여부 확인 (Connection refused 여부)
$ nc -zv -w 3 192.168.1.100 1521
# nc: connect to 192.168.1.100 port 1521 (tcp) failed: Connection refused
# 또는 curl을 이용한 포트 오픈 검사:
$ curl -v telnet://192.168.1.100:1521
# 3. DB 서버 관점: 오라클 리스너 데몬의 실행 상태 점검
$ lsnrctl status
# Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbserver)(PORT=1521)))
# TNS-12541: TNS:no listener
# TNS-12560: TNS:protocol adapter error
# TNS-00511: No listener
# Linux Error: 111: Connection refused
# -> 리스너 프로세스가 다운되었거나 기동되지 않은 상태 확인
# 4. DB 서버 관점: 1521 포트를 리스닝 중인 프로세스 점검
$ sudo ss -tulpn | grep :1521
# 아무것도 출력되지 않는다면 리스너가 실제로 꺼져 있음을 의미
# 5. DB 서버 관점: 방화벽 정책에서 1521 포트 차단 여부 점검
$ sudo firewall-cmd --list-ports | grep 1521
$ sudo iptables -L INPUT -v -n | grep 1521
스크립트
오라클 DB 서버 로컬에서 실행하여 listener.ora 설정의 유효성(호스트명 매핑 등)을 확인하고, 리스너 프로세스 활성 상태 및 1521 포트 바인딩 여부를 단계별로 진단한 후 필요시 리스너 시작을 유도하는 쉘 스크립트입니다.
#!/bin/bash
# diagnose_oracle_listener.sh - Diagnose ORA-12541 TNS:no listener and Oracle Net Listener status
export ORACLE_SID=${ORACLE_SID:-"orcl"}
export ORAENV_ASK=NO
[ -f /usr/local/bin/oraenv ] && . /usr/local/bin/oraenv >/dev/null 2>&1
echo "=========================================="
echo " [오라클 리스너 및 ORA-12541 진단]"
echo " ORACLE_HOME: ${ORACLE_HOME:-"미설정"}"
echo "=========================================="
# 1. lsnrctl 명령어 존재 여부 점검
if ! command -v lsnrctl &>/dev/null; then
echo " [오류] lsnrctl 명령어를 찾을 수 없습니다. 오라클 환경변수(PATH)를 점검하세요."
exit 1
fi
# 2. 리스너 프로세스(tnslsnr) OS 실행 여부 확인
echo -e "\n[1] OS 레벨 리스너 프로세스 점검:"
LSNR_PID=$(pgrep -f "tnslsnr" | head -n 1)
if [ -z "$LSNR_PID" ]; then
echo " [경고] tnslsnr 프로세스가 실행되어 있지 않습니다."
echo " -> 리스너 다운이 ORA-12541 오류의 직접 원인입니다."
else
echo " [정상] tnslsnr 프로세스 감지 (PID: ${LSNR_PID})"
fi
# 3. 1521 포트 리스닝 상태 확인
echo -e "\n[2] TCP 1521 포트 바인딩 점검:"
PORT_INFO=$(ss -tulpn | grep -E ':1521\s')
if [ -z "$PORT_INFO" ]; then
echo " [오류] 1521 포트가 LISTEN 상태가 아닙니다."
else
echo " [정상] 1521 포트 수신 대기 중:"
echo " $PORT_INFO"
fi
# 4. listener.ora 파일 구성 및 호스트명 점검
ADMIN_DIR="${ORACLE_HOME}/network/admin"
LISTENER_ORA="${ADMIN_DIR}/listener.ora"
echo -e "\n[3] listener.ora 설정 점검 (${LISTENER_ORA}):"
if [ -f "$LISTENER_ORA" ]; then
grep -vE "^#|^$" "$LISTENER_ORA" | sed 's/^/ /'
# 호스트명 바인딩 불일치 검사
CONFIG_HOST=$(grep -i "HOST" "$LISTENER_ORA" | grep -oE "HOST\s*=\s*[^)]+" | awk -F'=' '{print $2}' | tr -d ' ')
CURRENT_HOSTNAME=$(hostname)
echo " - listener.ora 설정 호스트: ${CONFIG_HOST}"
echo " - 실제 시스템 호스트명 : ${CURRENT_HOSTNAME}"
if [ "$CONFIG_HOST" != "0.0.0.0" ] && [ "$CONFIG_HOST" != "$CURRENT_HOSTNAME" ] && [ "$CONFIG_HOST" != "localhost" ]; then
echo " [주의] 호스트명이 불일치하여 리스너 기동 실패 가능성이 있습니다. /etc/hosts 파일을 확인하세요."
fi
else
echo " [안내] listener.ora 파일이 없습니다. 기본 파라미터로 구동 여부를 확인합니다."
fi
# 5. lsnrctl status 명령 실행 결과 점검
echo -e "\n[4] lsnrctl status 실행 테스트:"
STATUS_RES=$(lsnrctl status 2>&1)
if echo "$STATUS_RES" | grep -q "TNS-12541"; then
echo " [실패] 리스너가 중지 상태입니다 (TNS-12541 감지)."
echo " -> 복구 조치: 'lsnrctl start' 명령을 실행하여 리스너를 기동하십시오."
elif echo "$STATUS_RES" | grep -q "STATUS of the LISTENER"; then
echo " [성공] 리스너가 정상 작동 중입니다."
# 등록된 서비스 개수 추출
SVC_COUNT=$(echo "$STATUS_RES" | grep -c "Service.*has.*instance")
echo " - 서비스에 등록된 인스턴스 수: ${SVC_COUNT}개"
else
echo " [기타 응답]:"
echo "$STATUS_RES" | head -n 10 | sed 's/^/ /'
fi
echo -e "\n=========================================="
echo " [진단 완료]"
echo "=========================================="
해설
ORA-12541: TNS:no listener는 오라클 클라이언트가 데이터베이스 서버에 연결을 맺기 위해 대상 IP와 포트(통상 TCP 1521)로 TCP 연결(SYN)을 시도했으나, 목적지 서버의 해당 포트에서 연결 요청을 수신하고 대기(LISTEN) 중인 리스너 프로세스(tnslsnr)가 없을 때 반환되는 네트워크 계층 오류입니다.
1. ORA-12541 vs ORA-12514 차이점
오라클 접속 문제에서 가장 자주 혼동되는 두 에러의 차이점을 명확히 알아야 합니다.
| 에러 코드 | 원인 및 상태 | 비유 |
|---|---|---|
ORA-12541: TNS:no listener |
대상 IP:PORT에 리스너 프로세스 자체가 켜져 있지 않거나(Connection refused) 방화벽에 의해 포트 접근이 차단됨. | 건물 경비원(리스너)이 퇴근하여 부재중이거나 정문 문이 잠겨 있어 진입조차 못 함 |
ORA-12514: TNS:listener does not currently know of service |
리스너는 1521번으로 잘 동작 중이나, 클라이언트가 요청한 서비스명(SERVICE_NAME)이 리스너에 등록되어 있지 않음. | 경비원은 만나서 대화했으나, 찾으려는 입주자(인스턴스)가 명단에 없음 |
2. 주요 발생 원인
- 오라클 리스너 데몬의 다운 또는 미기동 (가장 흔함):
- DB 서버가 재부팅되었으나
lsnrctl start를 실행하지 않았거나 리스너 프로세스가 비정상 종료(Crash)된 경우.
- DB 서버가 재부팅되었으나
tnsnames.ora의 IP 및 포트 오설정:- 클라이언트의
tnsnames.ora파일에 기재된HOSTIP 또는PORT번호가 실제 DB 서버와 다르게 잘못 적혀 있는 경우.
- 클라이언트의
listener.ora와/etc/hosts호스트명 불일치:listener.ora파일에(HOST = dbserver1)로 적혀 있으나, 서버 IP가 바뀌었거나/etc/hosts에 해당 호스트명에 대한 루프백/IP 매핑이 누락되어 리스너가 바인딩에 실패한 경우.
- OS 방화벽 또는 클라우드 보안 그룹(Security Group) 차단:
- 리스너는 1521 포트로 열려 있으나, 리눅스 OS 방화벽(
firewalld,iptables) 또는 AWS/GCP의 보안 그룹에서 인바운드 1521 포트가 열려 있지 않아 클라이언트 패킷이 거부되는 경우 (REJECT정책 시 refused 유발).
- 리스너는 1521 포트로 열려 있으나, 리눅스 OS 방화벽(
3. 단계별 해결 방법
1) 리스너 기동 및 상태 확인
DB 서버의 oracle 계정으로 로그인하여 리스너를 시작합니다.
# 리스너 시작
lsnrctl start
# 리스너 상태 확인
lsnrctl status
- 서비스가 정상적으로 뜨면
The command completed successfully메시지와 함께 1521 포트 리스닝 상태가 표시됩니다.
2) listener.ora 파일 호스트명 점검 ($ORACLE_HOME/network/admin/listener.ora)
특정 호스트명 바인딩 실패를 방지하기 위해 IP 주소를 직접 지정하거나 0.0.0.0으로 바인딩합니다.
# $ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
수정 후 리스너를 재시작합니다:
lsnrctl reload
# 또는
lsnrctl stop && lsnrctl start
3) 방화벽 1521 포트 허용
외부 클라이언트가 DB 서버의 1521 포트에 접근할 수 있도록 방화벽을 엽니다.
- firewalld (RHEL/Rocky/CentOS):
sudo firewall-cmd --permanent --add-port=1521/tcp sudo firewall-cmd --reload - UFW (Ubuntu):
sudo ufw allow 1521/tcp
주의사항
- DB 인스턴스 등록 대기 시간 (Dynamic Registration):
- 리스너를 방금 켰다면(
lsnrctl start), DB 인스턴스의 백그라운드 프로세스(PMON 또는 LREG)가 리스너에 DB 서비스를 등록(동적 서비스 등록)하는 데 보통 1분에서 최대 3분 정도의 시간이 소요됩니다. 리스너를 켠 직후에는 잠시ORA-12514가 뜰 수 있으므로, 즉시 등록하려면sqlplus / as sysdba접속 후ALTER SYSTEM REGISTER;명령을 내려주어야 합니다.
- 리스너를 방금 켰다면(
- 클라우드 환경(AWS EC2 등)의 공인 IP 바인딩 금지:
- AWS EC2 인스턴스의
listener.ora에 탄력적 공인 IP(Elastic IP)를 직접 기입하면 리스너 구동 시TNS-12545: Connect failed because target host or object does not exist에러가 발생합니다. 클라우드 환경에서는 항상 사설 IP(Private IP), 내부 호스트명, 또는0.0.0.0으로 바인딩해야 합니다.
- AWS EC2 인스턴스의
tnsnames.ora캐시 및 클라이언트 TNS 설정 주의:- 서버 측 리스너가 정상 구동 중임에도 클라이언트 PC에서 계속 ORA-12541이 발생한다면, 클라이언트 PC의
tnsnames.ora파일이 엉뚱한 구형 IP를 바라보고 있거나, 로컬hosts파일에 잘못된 IP 매핑이 캐싱되어 있을 가능성이 높으므로 클라이언트 측 네트워크 경로를 확인해야 합니다.
- 서버 측 리스너가 정상 구동 중임에도 클라이언트 PC에서 계속 ORA-12541이 발생한다면, 클라이언트 PC의