Подробный гайд: Ошибка «Listener state: Not listening»
Представлен подробный практический гайд по диагностике и устранению ошибки Listener state: Not listening в Oracle Database. Гайд ориентирован на версии 11gR2 – 19c и охватывает типичные сценарии, логи, команды и превентивные меры.
1. Что означает эта ошибка
Сообщение Listener state: Not listening появляется в выводе команды:
lsnrctl status
Оно означает, что процесс слушателя (tnslsnr) запущен, но не успешно привязался к сетевым конечным точкам (адресам/портам), указанным в listener.ora. В результате слушатель не принимает входящие соединения, хотя процесс существует в ОС.
Не путать с:
Instance "..." status UNKNOWN— проблема регистрации БД, а не самого слушателя.ORA-12541: TNS:no listener— слушатель вообще не запущен или порт недоступен клиенту.
2. Типичные причины
| Причина | Как проявляется |
|---|---|
| Порт уже занят другим процессом | lsnrctl start падает или статус показывает Not listening |
Ошибка в listener.ora (синтаксис, дубли, неверный IP/хост) |
Слушатель не может распарсить или привязаться к адресу |
| Проблемы с DNS/hostname | Listener привязывается к адресу, который не резолвится или не принадлежит серверу |
| Недостаточно прав (Linux/Unix) | Попытка привязки к порту < 1024 без root/CAP_NET_BIND_SERVICE |
Слушатель "завис" после reload или падения |
Процесс висит, но сетевые сокеты не восстановлены |
Несоответствие ORACLE_HOME/PATH |
Бинарники tnslsnr не находят библиотеки или конфигурацию |
3. Пошаговая диагностика
Шаг 1. Проверка текущего статуса
lsnrctl status
Обратите внимание на блок:
Listening Endpoints Summary...
Если он пуст или содержит (ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=...)) (NOT LISTENING), переходите к шагу 2.
Шаг 2. Просмотр логов слушателя (ADR)
С версии 11g логи хранятся в структуре ADR:
echo $ORACLE_BASE
# Обычно: /u01/app/oracle
# Перейдите в:
$ORACLE_BASE/diag/tnslsnr/$(hostname)/<имя_слушателя>/trace/
ls -l listener.log
tail -n 50 listener.log
Ищите строки:
TNS-12545: Connect failed because target host or object does not existTNS-12547: TNS:lost contactError listening on: (ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=...))Permission deniedилиAddress already in use
Шаг 3. Проверка занятости порта в ОС
# Linux
ss -tlnp | grep 1521
# или
netstat -tlnp | grep 1521
# или
lsof -i :1521
Если порт занят другим процессом (не tnslsnr), нужно остановить конфликтующий сервис или изменить порт в listener.ora.
Шаг 4. Проверка hostname и резолвинга
hostname -f
ping $(hostname -f)
cat /etc/hosts | grep $(hostname)
Listener привязывается к полному доменному имени (FQDN). Если в /etc/hosts указано 127.0.0.1 hostname, а в listener.ora стоит внешний IP, привязка может упасть.
Шаг 5. Проверка прав и окружения
whoami
echo $ORACLE_HOME
ls -l $ORACLE_HOME/bin/tnslsnr
Убедитесь, что вы работаете от oracle, переменные заданы, а бинарник имеет права на выполнение.
4. Пошаговое решение
4.1. Корректная остановка и запуск
lsnrctl stop
# Убедитесь, что процесс исчез
ps -ef | grep tnslsnr | grep -v grep
lsnrctl start
lsnrctl status
Примечание:
lsnrctl reload не восстанавливает упавшие сокеты. При Not listening требуется полный stop/start.
4.2. Проверка и правка listener.ora
Файл обычно находится в $ORACLE_HOME/network/admin/listener.ora или $TNS_ADMIN/listener.ora.
Минимальная рабочая конфигурация:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ваш.fqdn.или.ip)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(PROGRAM = extproc)
)
)
Правила:
HOSTдолжен резолвиться в IP, принадлежащий серверу.- Не используйте
localhost, если клиент подключается извне. - Избегайте дублирующих
ADDRESSблоков. - После правки:
lsnrctl stop->lsnrctl start.
4.3. Если порт занят
- Найдите процесс:
ss -tlnp | grep 1521 - Если это другой Oracle-слушатель или
postgres, остановите его. - Если изменить нельзя, смените порт в
listener.ora(например,1522) и обновитеtnsnames.oraу клиентов.
4.4. Принудительная регистрация сервисов (после старта слушателя)
sqlplus / as sysdba
ALTER SYSTEM REGISTER;
EXIT;
Затем:
lsnrctl services
Убедитесь, что статусы сервисов READY, а не UNKNOWN.
5. Профилактика и лучшие практики
| Практика | Зачем |
|---|---|
Не редактировать listener.ora вручную без бэкапа |
Исключает синтаксические ошибки |
Использовать netca для генерации конфигов |
Гарантирует валидный синтаксис |
Настроить ротацию логов (LOGGING_LISTENER=OFF или LOG_FILE_SIZE) |
Предотвращает переполнение диска |
| Мониторить порт 1521 через Zabbix/Prometheus | Раннее обнаружение падений |
Фиксировать hostname в /etc/hosts и DNS |
Избегает проблем с привязкой |
Регулярно проверять lsnrctl status после патчей/перезагрузок |
Патчи иногда сбрасывают конфигурацию |
6. Шпаргалка по командам
| Команда | Назначение |
|---|---|
lsnrctl status |
Статус слушателя и конечных точек |
lsnrctl start / stop / reload |
Управление процессом |
lsnrctl services |
Регистрация БД и сервисов |
tnsping <alias> |
Проверка клиентского соединения |
ss -tlnp | grep 1521 |
Проверка порта в ОС |
adrci exec="show alert" |
Просмотр ADR-алертов слушателя |
7. Чек-лист быстрого восстановления
lsnrctl stopps -ef | grep tnslsnr— убить, если остался- Проверить
/etc/hostsиhostname -f - Проверить
listener.oraна синтаксис и дубли ss -tlnp | grep 1521— освободить портlsnrctl startlsnrctl status— убедиться, чтоListening Endpointsзаполненыsqlplus / as sysdba—ALTER SYSTEM REGISTER;- Проверить подключение клиентом
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.