ORA-12505, TNS: слушатель в настоящее время не знает SID, указанный в дескрипторе соединения

103

Я установил Oracle 11g Express Edition Release 2 в свою 64-разрядную ОС Windows 7 и попытался выполнить JDBC-программу, после чего я получил следующую ошибку:

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.jlcindia.jdbc.JDBCUtil.geOracleConnection(JDBCUtil.java:28)
    at Lab3O.main(Lab3O.java:15)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:385)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
    ... 8 more
  • 0
    Запуск OracleServiceXE вручную из сервисов у меня работал.
Теги:
jdbc

22 ответа

119

Я исправил эту проблему, исправив строку jdbc.

Например, правильная строка jdbc должна быть...

jdbc:oracle:thin:@myserver:1521/XE

Но строка jdbs, которую я использовал, - это...

jdbc:oracle:thin:@myserver:1521:XE

(Примечание: между 1521 и XE должен быть /)

Эта плохая строка jdbc также дает мне ошибку ORA-12505.

  • 41
    Если вы используете /, это имя сетевого сервиса, если вы используете двоеточие, то это SID.
  • 17
    Тот замечательный момент, когда вы гуглили исключение оракула и результаты оказались страницами стека переполнения вместо страниц оракула :) Исправление строки JDBC решило и мою проблему.
Показать ещё 1 комментарий
75

Есть несколько вещей, которые могут вызвать эту проблему, но прежде чем вы начнете работу с JDBC, вы должны быть уверены, что можете подключиться к базе данных с помощью SQL * Plus. Если вы не знакомы с SQL * Plus, это инструмент командной строки для подключения к базам данных Oracle, который долгое время являлся стандартной частью Oracle и включен в Oracle XE.

При подключении к базе данных Oracle с помощью JDBC вы не подключаетесь непосредственно к базе данных. Вместо этого вы подключаетесь к слушателю TNS, который затем соединяет вас с базой данных. Ошибка ORA-12505 означает, что слушатель встал и вы могли подключиться к нему, но он не смог подключить вас к базе данных, потому что он не знает, что эта база данных. Для этого есть две причины:

  • база данных не запущена,
  • база данных не была зарегистрирована у слушателя, например. потому что база данных была запущена перед слушателем. (Когда база данных начинается, она регистрируется при прослушивании, если она уже запущена. Если слушатель не запущен, база данных не регистрируется, и если слушатель запускается, он не ищет базы данных, которые могут зарегистрируйтесь в нем.)

ORA-12505 означает, что слушатель знает об этой базе данных, но слушатель не получил уведомление из базы данных, что база данных. (Если вы пытались подключиться к неправильной базе данных, используя неправильный идентификатор SID, вы получили бы ошибку ORA-12154 "TNS: не удалось разрешить указанный идентификатор подключения".)

Какие службы Oracle работают в оснастке "Службы"? (Откройте это из панели управления > "Администрирование" > "Службы" или просто "Пуск" > "Выполнить" > services.msc.) Вам нужны службы OracleServiceXE и OracleXETNSListener для запуска.

Если службы были запущены, можете ли вы подключиться к базе данных в SQL * Plus, используя любое из приведенных ниже команд в командной строке? (Я предполагаю, что вы запускаете их на машине, на которой установлен Oracle XE.)

sqlplus system/system-password@XE
sqlplus system/system-password
sqlplus / as sysdba

(Замените system-password паролем, который вы установили для пользователей SYS и SYSTEM во время установки Oracle XE.)

Первый из этих трех подключается через прослушиватель TNS, а второй два напрямую подключаются к базе данных, не проходя через прослушиватель, и работают только в том случае, если вы находитесь на том же компьютере, что и база данных. Если первый не удастся, но два других успеха, то соединения JDBC также потерпят неудачу. Если это так, подключитесь к базе данных с помощью одного из двух других и запустите ALTER SYSTEM REGISTER. Затем выйдите из SQL * Plus и снова попробуйте первую форму.

Если третий не работает, а второй работает, добавьте свою учетную запись в группу ora_dba. Сделайте это в панели управления > Управление компьютером > Локальные пользователи и группы.

Как только вы сможете получить соединения формы

sqlplus system/system-password@XE

вы должны иметь возможность подключаться к Oracle XE через JDBC. (Кстати, вы не указали нам код JDBC, который вы используете для подключения к базе данных, но я бы предположил, что он, скорее всего, правильный, будут другие другие ошибки, если части строки соединения были неправильными.)

  • 0
    спасибо Люк Вудворд ... я выполнил успешно ..
  • 3
    @Raj: я не вижу, что ваше редактирование приводит к ответу, поэтому я удалил его. Если вы хотите внести значительный вклад в вопрос, пожалуйста, оставьте свой ответ, а не редактируйте чужой.
Показать ещё 2 комментария
25

У меня тоже была такая же ошибка, но при попытке все три из них потерпели неудачу.  Если вышеуказанные три не пройдены. Проверьте статус LSNRCTL, если вы обнаружите, что служба (XE в моем случае) отсутствует, попробуйте это sqlplus /nolog conn system ... password ... connected. alter system register;
exit
lsnrctl stat
...

Теперь вы можете увидеть сервис Даже если вы не видите этого sqlplus /nolog
conn system
... password ... connected.
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;
... system altered ...
alter system register;
exit
lsnrctl stat

Это должно работать...

  • 1
    Ты сделал это, чувак! После установки local_listener , то ORCL слушатель в настоящее время показано на lsnrctl . Бесконечно благодарен!
  • 0
    Это заставило мою систему работать, но обратите внимание, что я запустил следующее: ALTER SYSTEM set local-listener = XE;
Показать ещё 5 комментариев
21

Когда вы получаете эту ошибку "ORA-12505, TNS: прослушиватель в настоящее время не знает о SID, заданном в дескрипторе соединения"

Решение: откройте службы и запустите OracleServiceXE, после чего попробуйте подключиться...

  • 0
    Отлично @ Редди, спасибо.
  • 0
    это работает для меня, спасибо.
Показать ещё 2 комментария
10

Я нашел некоторые причины для этого исключения. Они

1) Имя базы данных XE по умолчанию. Так как url ​​будет " jdbc: oracle: thin: @localhost: 1521: XE".

2) Убедитесь, что OracleServiceXE, OracleXETNSListener запущен. Он будет находиться в Панели управления\Все элементы панели управления\Администрирование\Сервисы

  • 0
    Да! Спасибо. Все, что мне было нужно, это XE. Если это имя по умолчанию, почему Oracle не включает это ни в один из своих примеров?
7

Я решил эту проблему, исправив код JDBC.

правильная строка JDBC должна быть...

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe","system","ishantyagi");

Но строка JDBC, которую я использовал, была...

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");

Итак, ошибка указания orcl вместо xe показала эту ошибку, поскольку имя SID было неправильным.

  • 0
    Да! Спасибо. Все, что мне было нужно, это XE. Я не знаю, почему это так плохо документировано.
  • 0
    Вы сэкономили много моего времени, спасибо!
6

Моя проблема решена, когда я использую приведенный ниже код:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@IPAddress:1521/servicename","userName","Password");
4

Oracle: Синтаксис названия службы в тонком стиле

Имена служб Thin-стиля поддерживаются только драйвером JDBC Thin. Синтаксис:

@//имя_хоста: port_number/service_name

http://docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

4

i изначально приходил сюда с той же проблемой. У меня был jus установлен Oracle 12c на Windows 8 (64-разрядный), но с тех пор я разрешил его с помощью "TNSPING xe" в командной строке... Если соединение не установлено или имя не найдено, попробуйте имя базы данных, в моем случае это было "orcl"... "TNSPING orcl" еще раз, и если он успешно завершит, вам нужно изменить SID на "orcl" в этом случае (или какое бы имя базы данных не использовалось)...

3

Столкнувшись с подобной ошибкой, любое из вышеперечисленных решений не помогло. В файле listner.ora возникла проблема. По ошибке я добавил SID из SID_LIST, как показано ниже (раздел между звездами *).

 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)
        )
        )

 *(SID_DESC =
           (SID_NAME = XE)
           (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
         )*
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        )
      )


    DEFAULT_SERVICE_LISTENER = (XE)

Исправлена ​​ошибка, описанная ниже:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
       (SID_NAME = XE)
       (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
     )
    (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 = 127.0.0.1)(PORT = 1521))
    )
  )


DEFAULT_SERVICE_LISTENER = (XE)

Остановлен и база данных Изображение 7139

Остановить прослушиватели OracleServiceXE и OracleXETNSListener вручную, поскольку это не остановилось автоматически, перейдя в Панель управления\Все элементы панели управления\Администрирование\Службы. Перезагрузили базу данных, и она работала как шарм.

3

Одна из возможностей, которую я не видел широко обсуждаемой, заключается в том, что может возникнуть проблема с решением имени хоста на самой главной машине. Если в файле /etc/hosts нет записи для $(hostname), слушатель Oracle становится путаным и не подходит.

Это оказалось моей проблемой, и добавление имени хоста и IP-адреса в /etc/hosts разрешило проблему.

2

Я столкнулся с той же проблемой и решил перезапустить службу OracleServiceXE. Goto Services.msc, а затем проверьте, что служба "OracleServiceXE" UP и работает

2

У меня была такая же проблема, поэтому для решения этой проблемы я сначала перенастроил свой прослушиватель, используя netca, после чего я удалил свою старую базу данных, которая была ORCL, с помощью dbca, а затем я снова создал новую базу данных, используя dbca

2

Я тоже столкнулся с той же проблемой. Я установил версию Oracle Express 10g в ОС Windows XP с помощью VMware, и она работает нормально. Поскольку было очень неудобно печатать SQL-запросы в утилите SQL, предоставляемой 10g, и поскольку я привык работать с разработчиком SQL, я установил 32-разрядный SQL-разработчик в XP и попытался подключиться к моему SID "XE" базы данных. Но соединение не удалось с ошибкой-ORA-12505 TNS-прослушиватель в настоящее время не знает о SID, заданном в дескрипторе соединения. Я был в море относительно того, как эта проблема возникла, поскольку она отлично работает с утилитой SQL, и я также создал несколько сопоставлений Informatica, используя то же самое. Я много просматривал этот материал туда и предлагал предложения, предлагаемые мне после того, как он ответил на статус "lsnrctl" на общественных форумах, но безрезультатно. Однако сегодня утром я попытался создать новое соединение снова, и Voila, он работал без проблем. Я угадываю после прочтения в нескольких сообщениях, которые иногда прослушиватель слушает перед подключением БД или чем-то (простите меня за мою грубую ссылку, поскольку я новичок здесь), но я предлагаю просто перезагрузить машину и снова проверить.

1

У меня была аналогичная проблема в SQL Workbench.

URL:

: оракул JDBC: тонкий: @111.111.111.111:1111: х

не работает.

URL:

: оракул JDBC: тонкий: @111.111.111.111:1111: AsDB

работы.

Это поможет мне в моей конкретной ситуации. Я боюсь, что может существовать множество других причин с различными решениями.

1

Пожалуйста, проверьте как OracleServiceXE, так и OracleXETNSListener статус, начатый при навигации по start->run->services.msc.

Для моего случая только OracleXETNSListener был запущен, но OracleServiceXE не был запущен, когда я начал с right clicking -> start и проверил соединение, которое оно работает для меня

1

Получилась одна и та же проблема внезапно после того, как возился с некоторыми cmd. Выключенный ORACLE SERVICE XE прекратил работу. Потребовал мне 2 секунды, чтобы перезапустить его из административных инструментов. TNX!

  • 1
    Это, вероятно, более уместно, чтобы добавить комментарий, потому что он короткий и не отвечает на вопрос
1

Проверьте, выполнив tnsping и имя экземпляра на главной машине. Это даст вам tns decription и все большую часть времени имя хоста отличается, что не соответствует.

Я также разрешаю свою проблему

В машине Unix $ tnsping (Enter)

Это дает мне полное описание tns, где я нашел, что имя хоста отличается..:)

0

Если вы используете Oracle Express Edition, вы должны иметь этот URL

JDBC: оракул: тонкий: @localhost: тысяча пятьсот двадцать один: х

У меня была аналогичная проблема с плагином Liquibase config в pom.xml. И я изменил конфигурацию:

`<configuration>
   <driver>oracle.jdbc.OracleDriver</driver>
   <url>jdbc:oracle:thin:@localhost:1521:xe</url>
   <defaultSchemaName></defaultSchemaName>
   <username>****</username>
   <password>****</password>
</configuration>`
0

Я исправил эту проблему, изменив " SID" на " SERVICE_NAME" в моем файле TNSNAMES.ora.

Посмотрите, запрашивает ли ваша БД SID или SERVICE_NAME.

Приветствия

0

В моем случае не получилось, наконец, я перезапустил слушателя и слушателя TNS, и все сработало. Боролся 2 дня.

0

Была аналогичная проблема. Проблема возникла внезапно - у нас есть URL-адрес подключения базы данных с балансировкой нагрузки, но в соединениях jdbc я указывал прямо на один db.

Изменен для загрузки сбалансированного db-url, и он сработал.

  • 2
    Мы рекомендуем использовать полный URL-адрес строки подключения, как показано ниже: jdbc: oracle: thin: @ (DESCRIPTION = (ADDRESS = (HOST = myhost) (PORT = 1521) (PROTOCOL = tcp)) (CONNECT_DATA = (SERVICE_NAME = myorcldbservicename)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню