ORA-12505, TNS: слухач наразі не знає SID, вказаний у дескрипторі підключення


154

Я встановив Oracle 11g Express Edition, випуск 2, у моєму Windows 7 64-бітну ОС і спробував виконати програму 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 вручну з сервісів, які працювали на мене.
Сен

Відповіді:


184

Я вирішив цю проблему, виправивши рядок jdbc.

Наприклад, правильний рядок jdbc повинен бути ...

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

Але рядок jdbs, який я використовував, це ...

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

(Примітка: між 1521та XEмає бути a /)

Цей поганий рядок 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 система / система-пароль
sqlplus / як 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.
Люк Вудвард

"база даних не зареєстрована у слухача, наприклад, тому, що база даних була запущена перед слухачем." - це було, дякую!
Ursache

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 встановлює local-listener = XE;
Даніель Вільямс

коли я набираю: 'alter system set local_listener =' (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) 'range = обидва;' Він повертає помилку: ORA-65040: operation not allowed from within a pluggable databaseщо це означає? Неможливо налаштувати JDBC: /
Alg_D

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 запущено. Він буде в Панелі керування \ Усі елементи Панелі управління \ Адміністративні інструменти \ Послуги


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 було неправильним.


У моєму випадку 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 вирішило проблему.



4

Якщо у вас є робоче з'єднання в Oracle SQL Developer, використовуйте інформацію в меню підключення для створення URL-адреси, як описано в наступному зображенні:

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

У наведеному вище прикладі URL буде: jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

Зауважте, що якщо ви використовуєте SID, то після імені хоста є двокрапка (":") замість косої риски ("/").


2

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


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: oracle: thin: @localhost: 1521: xe або jdbc: oracle: thin: @localhost: 1521 / XE

У мене були подібні проблеми з плагіном config config в 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і перевірив, чи працює його зв'язок


1

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

URL:

jdbc: oracle: thin: @ 111.111.111.111: 1111: xe

не працює.

URL:

jdbc: oracle: thin: @ 111.111.111.111: 1111: asdb

працює.

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


0

Мав подібне питання. Проблема почала виникати раптово - ми маємо завантажену URL-адресу підключення до бази даних, але в jdbc-з'єднаннях я вказував безпосередньо на один db.

Змінено для завантаження збалансованого URL-адреси db, і він працював.


2
Ми рекомендуємо використовувати повністю кваліфіковану URL-адресу рядка з'єднання, як показано jdbc: oracle: thin: @ (DESCRIPTION = (ADDRESS = (HOST = myhost) (PORT = 1521) (PROTOCOL = tcp)) (CONNECT_DATA = (SERVICE_NAME = myorcldbservicename)))
Нірмала

0

У моєму випадку не виходило, я нарешті перезапустив слухача Oracle і TNS, і все працювало. Боровся 2 дні.


0

Я отримав цю помилку ORA-12505, TNS: слухач на даний момент не знає SID, вказаний в дескрипторі підключення, коли я намагався підключитися до DB Oracle за допомогою розробника 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), існує ймовірність, що ваше антивірусне програмне забезпечення / брандмауер все ще може їх заблокувати. Просто переконайтесь, що вони не заблоковані.введіть тут опис зображення



0

Мій оракул перестав працювати, і я отримував цю помилку. Я перезапустив свою машину, а також спробував вище рішення. Врешті-решт я відкрив компоненти компонентів та перезапустив служби oracle і все почало працювати. Сподіваюся, що це комусь допоможе.


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 

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.