오라클에서 "ORA-12541: TNS: no listener" 오류는 클라이언트가 데이터베이스 서버에 연결을 시도했지만, 서버에서 리스너를 찾을 수 없을 때 발생합니다. 이는 주로 리스너가 실행되지 않거나, 리스너 설정이 잘못되어 있을 때 발생합니다. 이 오류를 해결하기 위한 다양한 방법을 아래와 같습니다.
[oracle@ora19c ~]$ oerr ora 12541
12541, 00000, "TNS:no listener"
// *Cause: The connection request could not be completed because the listener
// is not running.
// *Action: Ensure that the supplied destination address matches one of
// the addresses used by the listener - compare the TNSNAMES.ORA entry with
// the appropriate LISTENER.ORA file (or TNSNAV.ORA if the connection is to
// go by way of an Interchange). Start the listener on the remote machine.
오류 발생 원인
- 리스너 미실행: 데이터베이스 서버에서 리스너가 실행되지 않거나 중지된 경우.
- 리스너 설정 오류: 리스너의 설정 파일(listener.ora)에 문제가 있을 수 있습니다.
- 잘못된 호스트명 또는 포트: 클라이언트에서 지정한 호스트명이나 포트가 잘못되었을 경우 발생합니다.
- 방화벽 문제: 클라이언트와 서버 간의 방화벽 설정으로 인해 리스너가 차단될 수 있습니다.
- 네트워크 문제: 서버가 네트워크에 제대로 연결되지 않거나, DNS 설정 문제가 있을 경우에도 발생할 수 있습니다.
해결 방법
1. 리스너 확인 및 실행
리스너가 실행 중인지 확인하고, 실행되지 않으면 리스너를 시작해야 합니다.
리스너 상태 확인:
- 데이터베이스 서버에서 lsnrctl status 명령어를 실행하여 리스너의 상태를 확인합니다.
- lsnrctl status
- 만약 "TNS-12541: TNS: no listener" 오류가 발생한다면 리스너가 실행되지 않거나 중지된 것입니다.
리스너 시작: 리스너가 실행되지 않으면 다음 명령어를 사용하여 리스너를 시작합니다.
lsnrctl start
이 명령어는 리스너를 시작하고, 정상적으로 실행될 때까지 기다립니다. lsnrctl status 명령어로 다시 확인하여 리스너가 시작되었는지 확인합니다.
2. 리스너 설정 파일 확인 (listener.ora)
리스너가 시작되지 않거나 문제가 계속된다면, 리스너 설정 파일인 listener.ora 파일에 문제가 있을 수 있습니다.
설정 파일 위치: listener.ora 파일은 보통 ORACLE_HOME/network/admin/ 경로에 위치합니다. 해당 파일을 열고 설정을 점검합니다.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
설정 파일이 올바르게 되어 있는지, 특히 HOST와 PORT 값이 정확한지 확인합니다. 기본적으로 PORT는 1521입니다.
3. 호스트명 및 포트 확인
클라이언트에서 연결을 시도할 때 사용하는 호스트명과 포트가 정확한지 확인합니다. tnsnames.ora 파일에서 호스트명과 포트 번호가 올바르게 설정되어 있는지 점검합니다.
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
이 파일에서 HOST 값과 PORT 번호가 서버의 설정과 일치하는지 확인합니다.
4. 방화벽 설정 확인
방화벽이 서버에서 리스너 포트를 차단하고 있을 수 있습니다. 이 경우 방화벽 설정에서 1521 포트를 열어줘야 합니다.
- Linux: iptables 또는 firewalld 설정에서 포트 1521을 열어줍니다.
firewall-cmd --add-port=1521/tcp --permanent firewall-cmd --reload
- 예시 (firewalld 사용 시):
- Windows: Windows 방화벽에서 포트 1521을 허용하는 규칙을 추가합니다.
5. 네트워크 및 DNS 확인
클라이언트와 서버가 동일한 네트워크에 연결되어 있는지 확인합니다. 서버가 다른 네트워크에 있거나 DNS 설정이 잘못되면 TNS: no listener 오류가 발생할 수 있습니다.
DNS 설정 확인:
- ping 명령어를 사용하여 클라이언트에서 서버에 접근할 수 있는지 확인합니다.
- 서버의 IP 주소 대신 호스트명이 아닌 IP 주소로 직접 연결을 시도하여 문제를 파악할 수 있습니다.
6. 리스너 재시작
리스너 설정을 변경한 후에는 리스너를 재시작해야 할 수도 있습니다. lsnrctl reload 명령어를 사용하여 리스너를 재시작할 수 있습니다.
lsnrctl reload
리스너를 재시작하면 설정 변경 사항이 반영됩니다.
7. 데이터베이스 인스턴스 상태 확인
데이터베이스 인스턴스가 정상적으로 실행 중인지 확인합니다. sqlplus로 데이터베이스에 접속하여 인스턴스 상태를 점검할 수 있습니다.
sqlplus / as sysdba
그런 다음, 데이터베이스가 정상적으로 실행 중인지 확인합니다.
select status from v$instance;
인스턴스가 "OPEN" 상태인지 확인합니다.
8. 현재 리스너 서비스 상태 확인
[oracle@ora19c ~]$ lsnrctl services
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 19-MAY-2020 09:38:26
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 1 instance(s).
Instance "orclcdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "8a34def16cd55c76e0530100007f040c" has 1 instance(s).
Instance "orclcdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "orcl" has 1 instance(s).
Instance "orclcdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "orclcdb" has 2 instance(s).
Instance "orclcdb", status UNKNOWN, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0
LOCAL SERVER
Instance "orclcdb", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
Service "orclcdbXDB" has 1 instance(s).
Instance "orclcdb", status READY, has 1 handler(s) for this service...
Handler(s):
"D000" established:0 refused:0 current:0 max:1022 state:ready
DISPATCHER <machine: ora19c, pid: 7111>
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=47693))
The command completed successfully
[oracle@ora19c ~]$
결론
"ORA-12541: TNS: no listener" 오류는 주로 리스너가 실행되지 않거나 설정이 잘못된 경우 발생합니다. 위의 방법을 따라 리스너 상태를 확인하고, 설정 파일을 점검하며, 방화벽과 네트워크 문제를 해결해 나가면 이 오류를 해결할 수 있습니다. 리스너가 정상적으로 실행되면 클라이언트에서 데이터베이스 서버에 정상적으로 연결할 수 있게 됩니다.