Слушатель Oracle 11g не работает с ошибками ORA-12514 и ORA-12505

17

Я запускаю экземпляр Oracle 11g локально на моей машине для разработки и могу подключиться к локальному экземпляру напрямую через SqlPlus:

c:\>sqlplus ace

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> select count(*) from my_table ;

  COUNT(*)
----------
      5297

Но я не могу подключиться к нему через слушателя:

c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))"

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:52:40 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

Точно так же, если я подключаюсь через SqlDeveloper, я получаю ошибку (хотя и ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Этот экземпляр был стабильным и нормально работал в течение года или более до сегодняшнего дня в понедельник утром. Наши корпоративные ИТ-специалисты иногда выдвигают новые политики и обновления в выходные дни, поэтому я предполагаю, что что-то изменилось, но я не смог понять, что именно.

Я перезапустил службу и слушателя несколько раз, журнал слушателя не дает никаких подсказок.

Слушатель выглядит нормально:

c:\>lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 11:55:33

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 11.2.0.2.0 - Beta
Start Date                11-MAR-2013 11:17:30
Uptime                    0 days 0 hr. 38 min. 3 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora
Listener Log File         C:\oraclexe\app\oracle\diag\tnslsnr\FBC305BB46560\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Порт 1521 кажется нормальным:

c:\>netstat -an -O | find /i "1521"
  TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       4368
  TCP    169.243.90.109:55307   159.185.207.100:1521   ESTABLISHED     12416
  TCP    [::]:1521              [::]:0                 LISTENING       4368

(PID 4368 - это процесс TNSLSNR.exe.)

Кроме того, я могу tnspingк службе XE:

c:\>tnsping xe

TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 12:27:47

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Used parameter files:
C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (210 msec)

listenerr.oraФайл:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

Кроме того, и я понятия не имею, связано ли это, я не могу получить доступ к вершине https://127.0.0.1:8080/apex(хотя разрешения для этого кажутся нормальными).

Так, где еще я должен искать?

Обновление с запрошенной информацией:

SQL> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      XE
SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string

Update2 : как правильно указывает @ miracle173 , слушатель не был в порядке. С обновленным параметром 'local_listener' теперь отображается дополнительная информация:

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully
Unsliced
источник
Каковы значения вашего INSTANCE_NAMEпараметра инициализации и ORACLE_SIDпеременной среды? По какой-то причине ваша база данных не регистрируется в прослушивателе по умолчанию. Попробуйте выдать, alter system register;а затем повторно подключиться к базе данных.
Ясир Арсанукаев
@YasirArsanukaev имя_экземпляра равно 'xe' (в нижнем регистре, если это уместно), и у меня нет переменной среды ORACLE_SID.
Неразрезанный
3
две заметки: «слушатель выглядит нормально»: я так не думаю, потому что он не отображает службу с именем «XE», «я могу пропинговать службу XE»: tnsping подключается к слушателю, но не беспокоится о службах. таким образом, вы можете только показать, работает ли прослушиватель, но вы не можете использовать ist, чтобы проверить, зарегистрировал ли прослушиватель службу. Таким образом, tnsping "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))" завершится успешно, если прослушиватель работает на порту 1521 локального хоста, даже если сервис не существует.
чудо173
Сегодня я столкнулся с той же проблемой, и, как описано в @ miracle173, в alert.log есть регистрация. Oracle работает на ВМ. Оказывается на виртуальной машине, и hostname, и hostname.domain все указывают на IP-адрес, отличный от 127.0.0.1 (localhost). После изменения файла hosts (Windows \ system32 \ drivers \ etc) для принудительного сопоставления теперь все в порядке.
Изменить регистр исправил проблему .. спасибо :)
user116258

Ответы:

15

Итак, благодаря @YasirArsanukaev за то время, которое он вложил, я нашел решение, которое работает, но которое я не могу объяснить.

Следуя этой LOCAL_LISTENERмысли, я читал другой ответ, где говорилось:

База данных использует параметр LOCAL_LISTENER для идентификации слушателя, с которым она должна зарегистрироваться. По умолчанию это значение равно нулю, что в соответствии с документацией эквивалентно имени хоста: 1521.

Поэтому я попытался пропинговать свое собственное имя хоста и не смог - похоже на проблему с IPv6, получая общее сообщение об ошибке.

Поэтому я воспользовался советом из этого ответа

SQL> alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both;
SQL> alter system register;

и теперь он работает, предположительно, потому что он может разрешить ссылку на локальный хост, где он не смог разрешить фактическое имя хоста.

Unsliced
источник
1
вы на самом деле нашли решение: автоматическая регистрация базы данных по умолчанию LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP) (HOST = имя хоста) (PORT = 1521))' (где hostname - это сетевое имя компьютера) не работает, потому что есть проблема, чтобы добраться до машины под этим именем. Может быть, есть запись в alert.log или в каком-нибудь sqnlnet.log (% ORACLE_HOME% / network / log /) о проблеме регистрации базы данных
miracle173
@ Unliced ​​У меня фактически та же самая проблема, для моего случая она была решена, потому что используемый идентификатор службы удалил текст постфикса «.Domain.local».
Сон
выполнение двух операторов alter решило для меня сообщение об ошибке tns listner, и я смог подключиться
smartexpert