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

154

Я установил 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
ученик
источник
1
Запуск OracleServiceXE вручную из сервисов у меня работал.
Sen

Ответы:

184

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

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

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

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

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

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

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

Уэйд Х
источник
53
Если вы используете /, это имя сетевого сервиса, если вы используете двоеточие, то это SID.
Eckes
89

Есть несколько причин, которые могут вызвать эту проблему, но прежде чем начать работу с 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, который вы используете для подключения к базе данных, но я подозреваю, что он, скорее всего, правильный; были бы другие ошибки, если бы части строки подключения были неправильными.)

Люк Вудворд
источник
3
@Raj: я не вижу, что ваше редактирование приносит в ответ, поэтому я удалил его. Если вы хотите внести значительный вклад в вопрос, отправьте свой ответ, а не редактируйте чужой.
Люк Вудворд
@LukeWoodward Я получаю эту ошибку SP2-0734: unknown command beginning "system/ora..." - rest of line ignored. на всех 3
vaibhavcool20
1
@qtpseleniumSupport: в этом сообщении говорится, что вы работали в SQL * Plus и ввели строку system/ora...(или SQL * Plus прочитал эту строку из файла, который вы сказали ему прочитать). Командные строки, которые я дал выше, предназначены для использования из командной строки / оболочки / окна терминала. Если вы уже используете SQL * Plus, замените sqlplusна connect.
Люк Вудворд,
«База данных не зарегистрирована в прослушивателе, например, потому что база данных была запущена до прослушивателя». - это все, спасибо!
Уршаче
47

Я тоже получил ту же ошибку, но при попытке все три из них не удалось. Если вышеперечисленные три не удаются. Попробуйте статус LSNRCTL, если служба отсутствует (в моем случае XE), попробуйте это

sqlplus /nolog
conn  system
alter system register;  
exit  
lsnrctl status  

Теперь вы можете увидеть сервис
Даже если не видите, попробуйте этот

sqlplus /nolog  
conn system  
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;  
alter system register;  
exit  
lsnrctl status

Это, вероятно, должно работать ...

Радж
источник
2
Ты сделал это, чувак! После настройки local_listenerпрослушиватель orcl теперь отображается в lsnrctl. Бесконечно благодарен!
спрашивает
Это заставило мою систему работать, но обратите внимание, что я запустил следующее: ALTER SYSTEM set local-listener = XE;
Дэниел Уильямс,
когда я набираю: 'alter system set local_listener =' (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) 'scope = both;' Возвращает ошибку: ORA-65040: operation not allowed from within a pluggable databaseчто это значит? Не
удается
1
оба ответа с наибольшим количеством голосов помогли, но этот помог больше. Похоже, у меня не было 127.0.0.1 в качестве адреса слушателя (у меня был адрес с локальным именем моего ПК). Таким образом, добавив этот новый, он начал работать
johnbr
alter system set local_listener = ... работал на меня.
Бен Асмуссен
31

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

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

С Нагесвара Редди
источник
У меня была та же проблема, но с запуском OracleServiceXE. Поэтому перезапуск службы OracleServiceXE работал для меня. Не знаю почему ?!
Хамедз
При поиске OracleServiceXE имейте в виду, что XE соответствует SID базы данных, поэтому убедитесь, что вы ищете правильный сервис, OracleService [SID]
Sandoval0992
10

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

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

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

rajeesh
источник
8

Я решил эту проблему, исправив мой код 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 было неверным.

javabeginner
источник
В моем случае conection = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");сработало.
Пран Кумар Саркар
8

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

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@IPAddress:1521/servicename","userName","Password");
Рашид Путтур
источник
7

Столкнулся с подобной ошибкой, ни одно из вышеперечисленных решений не помогло. Возникла проблема в файле 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)

Остановился и база данных введите описание изображения здесь

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

Нирмал Мангал
источник
4

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

Хосе Рего
источник
4

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

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

BillT
источник
4

Если у вас есть работающее соединение в Oracle SQL Developer, используйте информацию в меню соединений для создания вашего URL, как описано на следующем рисунке:

введите описание изображения здесь

В приведенном выше примере URL будет: jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

Обратите внимание, что если вы используете SID, то после имени хоста вместо косой черты ("/") стоит двоеточие (":").

Пьер С
источник
2

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

user2905345
источник
2

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

Технократ
источник
2

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

Виджай Тайалан
источник
2

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

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

ура

Акшай Локур
источник
2

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

JDBC: оракул: тонкий: @localhost: 1521: XE или JDBC: оракул: тонкий: @localhost: 1521 / XE

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

`<configuration>
   <driver>oracle.jdbc.OracleDriver</driver>
   <url>jdbc:oracle:thin:@localhost:1521:xe</url>
   <defaultSchemaName></defaultSchemaName>
   <username>****</username>
   <password>****</password>
</configuration>`
Павел чечехов
источник
2

Соединение con = DriverManager.getConnection ("jdbc: oracle: thin: @localhost: 1521: xe", "scott", "tiger");

Ошибка, которую я получил:

java.sql.SQLException: слушатель отклонил соединение со следующей ошибкой: ORA-12505, TNS: слушатель в настоящее время не знает SID, указанный в дескрипторе соединения. Дескриптор соединения, используемый клиентом, был: localhost: 1521: xe

Как я это решил:

Соединение con = DriverManager.getConnection ("jdbc: oracle: thin: localhost: 1521: xe", "scott", "tiger");

(Удалять @)

Не знаю почему, но это работает сейчас ...

Срикар Мадхавапедди
источник
1

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

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

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

Это дает мне полное описание TNS, где я обнаружил, что имя хоста отличается .. :)

Абхишек Баник
источник
1

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

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

user5211481
источник
1

У меня была похожая проблема в SQL Workbench.

URL:

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

не работает

URL:

jdbc: оракул: thin: @ 111.111.111.111: 1111: asdb

работает.

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

Máťa - Stitod.cz
источник
0

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

Изменено, чтобы загрузить сбалансированный URL базы данных, и это работало.

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

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

Amarjeet
источник
0

Я получил эту ошибку ORA-12505, TNS: слушатель в настоящее время не знает SID, указанный в дескрипторе соединения, когда я пытался подключиться к Oracle DB с помощью разработчика SQL.

Используемая строка JDBC была jdbc: oracle: thin: @myserver: 1521 / XE , очевидно, правильная и две обязательные службы Oracle: OracleServiceXE, OracleXETNSListener были запущены и работали .

То, как я решил эту проблему (в Windows 10)

 1. Open run command.
 2. Type services.msc 
 3. Find services with name OracleServiceXE and OracleXETNSListener in the list.
 4. Restart OracleServiceXE service first. After completing the restart try restarting OracleXETNSListener service.
г-солнечный
источник
0

Помимо запуска сервисов (OracleServiceXE, OracleXETNSListener) существует вероятность того, что антивирусное программное обеспечение / брандмауэр все еще может их блокировать. Просто убедитесь, что они не заблокированы.введите описание изображения здесь

sql_dummy
источник
0

Я просто исправил это путем перезапуска / запуска oracleService в сервисах

Шахид Хуссейн Аббаси
источник
0

Мой оракул перестал работать, и я получил эту ошибку. Я перезапустил свою машину, а также попробовал вышеуказанные решения. В конечном итоге я открыл службы компонентов и перезапустил службы Oracle, и все это заработало. Надеюсь, это кому-нибудь поможет.

rj4u
источник
0

Я просто неправильно создавал ссылку на базу данных.

Для меня было просто изменить SID на SERVICE_NAME.

CREATE DATABASE LINK my_db_link
CONNECT TO myUser IDENTIFIED BY myPassword
USING
'
(
    DESCRIPTION=
    (
        ADDRESS=
        (PROTOCOL=TCP)
        (HOST=host-name-heren)
        (PORT=1521)
    )
    (CONNECT_DATA=(SID=theNameOfTheDatabase))
)';

изменения

SID=theNameOfTheDatabase

в

SERVICE_NAME=theNameOfTheDatabase 

решил мою проблему.

Павел
источник