ORA-12514 TNS: слухач наразі не знає про послугу, яку запитують у дескрипторі підключення


226

У нас є програма, що працює локально, і ми відчуваємо таку помилку:

ORA-12514: TNS: слухач наразі не знає про послугу, яку запитують у дескрипторі підключення

Я перевірив з'єднання, використовуючи TNSPingяке вирішено правильно, і я спробував SQLPlusспробувати підключення, яке не вдалося з тією ж помилкою, що і вище. Цей синтаксис я використав для SQLPlus:

sqlplus username/password@addressname[or host name]

Ми підтвердили, що:

  • слухач TNS на сервері працює.
  • Сам Oracle на сервері працює.

Ми не знаємо жодних змін, внесених до цього середовища. Що ще ми можемо перевірити?


2
що таке команда TNSPing (з парами), яку ви використовували?
Grzegorz W

коли ви говорите "працює локально", ви маєте на увазі, що програма підключається до бази даних на тому ж хості? Також, який вміст вашого файлу sqlnet.ora? які версії повідомляються про sqlplus та tnsping, і ви впевнені, що вони в одному ORACLE_HOME?
Девід Олдрідж

1
спробуйте перезапустити базу даних. Оскільки вони повинні повідомити слухача про своє існування при запуску, це може вирішити вашу проблему.
Jens Schauder

1
ALTER SYSTEM REGISTER менш різкий, ніж перезапуск бази даних.
DCookie

Відповіді:


209

У мене виникла ця проблема, і виправлення полягало в тому, щоб у вашій базі даних tnsnames.oraбуло SERVICE_NAMEвказано дійсне ім’я служби. Щоб дізнатися дійсні імена служб, ви можете використовувати наступний запит в oracle:

select value from v$parameter where name='service_names'

Після оновлення tnsnames.oraдо:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

тоді я побіг:

sqlplus user@TEST

Успіху! Слухач в основному каже вам, що незалежно від служби_користування, яку ви використовуєте, не є дійсною службою відповідно до БД.

(* Я працював sqlplus з робочої станції клієнта Win7 у віддалену БД і звинувачував DBA;) *)


2
У програмі win7% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Бред

198
Як я повинен запитувати БД, якщо я навіть не в змозі підключитися до нього ??
isabelle martz

2
Чи можете ви прямувати до SS-сервера безпосередньо та запускати sqlplus звідти?
Бред Ріппе

1
це може бути не в тому випадку, коли на одній машині встановлюються або використовувалися кілька клієнтів / серверів. (tnsping виводить розташування каталогу, який він використовує) - в моєму випадку listener.ora в цьому каталозі містив інформацію, що стосується старого екземпляра бази даних, який я видалив, - швидким і брудним способом було скопіювати весь вміст listener.ora з моє поточне встановлення Oracle Express, в інший каталог, який слухач, здається, перевіряє (я думаю, я змінив його через реєстр чи щось таке, і він має перевагу над ORACLE_HOME (?))
hello_earth

8
ORA-00942: таблиці або перегляду не існує
Томмі Холман

44

Я знаю, що це старе питання, але все ще без відповіді. У мене знадобився день дослідження, але я знайшов найпростіше рішення, принаймні в моєму випадку (Oracle 11.2 на Windows 2008 R2) і хотів поділитися.

Помилка, якщо її дивитись безпосередньо, вказує на те, що слухач не розпізнає ім’я послуги. Але де він зберігає назви служб? В%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

"SID_LIST" - це саме те, перелік SID-ів і службових імен, сполучених у форматі, який ви можете скопіювати або знайти.

Я додав проблему Ім'я служби, потім на панелі управління Windows "Послуги" я зробив "Перезапуск" на службі слухача Oracle. Зараз все добре.


Наприклад, файл listener.ora спочатку може виглядати так:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

... А щоб він визнав назву послуги orcl, ви можете змінити її на:

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

3
Потрібно оновити цю відповідь синтаксисом того, як listener.oraзберігаються імена. У мене навіть немає listener.oraфайлу. Я також перебуваю на клієнтській робочій станції під керуванням SQL Developer і намагаюся просто створити посилання на базу даних, коли я отримую помилку. У мене немає служби слухача Oracle для перезапуску.
vapcguy

vapcguy, вам потрібно бути на сервері баз даних. це здається, що ти на клієнті
Джозеф Археніо

Дотримуючись вказівок Sepideh за участю Net Manager, я помітив, що мій файл listeners.ora було оновлено, щоб містити нову запис SID_LIST. Цю відповідь я відредагував, щоб включити приклад синтаксису до і після, на користь читачів, які з будь-якої причини не можуть використовувати Net Manager.
Кевін

12

У мене ця проблема була на Windows Server 2008 R2 та Oracle 11g

перейдіть до Менеджера мереж> Слухач> виберіть служби баз даних у полі "> Ім'я глобальної бази даних" повинно бути таким же, як "SID", а "Домашня директорія Oracle" повинна бути правильною.

Якщо у вас немає записів для служб баз даних, створіть її та встановіть правильну глобальну базу даних sidта оракул додому.


12

У моїх обставинах помилка була пов’язана з тим, що слухач не зареєстрував послугу db. Я вирішив це, зареєструвавши служби. Приклад:

Мій дескриптор tnsnames.ora:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

Отже, я переходжу до реєстрації послуги listener.oraвручну:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

Нарешті, перезапустіть слухача командою:

> lsnrctl stop
> lsnrctl start

Готово!


8

Запуск OracleServiceXXX з services.msc працював на мене в Windows.


У Windows, якщо ви використовуєте Oracle Release 12.x, переконайтеся, що служба OracleServiceORCL працює. Якщо ця послуга не запущена, ви також отримаєте той самий код помилки.
вуличний яструб

5

Це дійсно має бути коментарем до відповіді Бреда Ріппе , але, на жаль, недостатньо реп. Ця відповідь отримала мені 90% шляху туди. У моєму випадку встановлення та конфігурація баз даних містять записи у файлі tnsnames.ora для баз даних, які я працював. По-перше, я зміг підключитися до бази даних, встановивши змінні середовища (Windows):

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

а потім підключення за допомогою

sqlplus / as sysdba

Далі, запустивши команду з відповіді Бреда Ріппе:

select value from v$parameter where name='service_names';

показали, що імена точно не відповідають. Записи, створені за допомогою помічника з налаштування бази даних Oracle, де спочатку:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

Ім'я служби з запиту було просто, mydatabaseа не mydatabase.mydomain.com. Я відредагував файл tnsnames.ora лише базове ім’я без частини домену, щоб вони виглядали так:

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

Я перезапустив послугу слухача TNS (я часто використовую lsnrctl stopі lsnrctl startз вікна команд адміністратора [або Windows Powershell] замість панелі управління Служби, але обидва працюють.) Після цього я зміг підключитися.


4

У мене була така ж проблема. Для мене просто писати

sqlplus myusername/mypassword@localhost

зробив трюк, завдяки цьому він підключається до імені служби за замовчуванням, я думаю.


1
У нас була аналогічна проблема з нашим рядком з'єднання, що спричинило цю помилку. Ми підключали з допомогою тонкого драйвера Oracle, JDBC з рядком підключення: jdbc:oracle:thin:@//localhost:1521/orcl. Скоригований рядок підключення , щоб усунути цю помилку було: jdbc:oracle:thin:@localhost:1521.
дан

залежить, чи буде це працювати - я думаю, що цей спосіб підключення, судячи з того, що говорили інші, цілком обходить слухача, використовуючи ім'я хоста комп'ютера замість SID - такий спосіб підключення викликає проблеми у сторонніх клієнтів, - я думаю він також працює лише тоді, коли EZCONNECT вказано в sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth

3

те, що для мене працювало, було насправді простим, мені просто потрібно було ініціювати послугу вручну в "Сервісах Windows" (services.msc in cmd trompt). моє ім'я служби: OracleServiceXXXXX.


У моєму випадку, хоча Тип запуску встановлено на Автоматичний, він не запускається під час завантаження машини. Після запуску служби вручну "OracleServiceXE", вона працює для бази даних Oracle 11g Express для підключення до веб-сторінки DB та APEX (Oracle Application Express).
Іван Чау

2

Перевірте, чи базується база даних. Увійдіть на сервер, встановіть змінну середовища ORACLE_SID на SID бази даних та запустіть SQL * Plus як локальне з'єднання.


Це була саме моя проблема. У нашій базі даних розміщений VM, який був відключений, коли я намагався використати іншу програму, яка використовувала DP. Побачивши цю тему, я зрозумів, що вона, ймовірно, вниз.
Sh4d0wsPlyr

2

Ця помилка може виникнути, коли програма встановлює нове з'єднання для кожної взаємодії з базою даних або якщо з'єднання не закриті належним чином. Один з безкоштовних інструментів для контролю та підтвердження цього - розробник Oracle Sql (хоча це не єдиний інструмент, який можна використовувати для моніторингу сеансів БД).

Ви можете завантажити інструмент з сайту oracle Sql Developer

ось скріншот, як слідкувати за сеансами. (якщо ви бачите багато сеансів, що накопичуються для користувача вашої програми під час, коли ви бачите помилку ORA-12514, це є хорошим показником того, що у вас може виникнути проблема з пулом підключення).

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


2

Я вирішив цю проблему в середовищі Linux, оновлюючи IP-адресу моєї машини у файлі / etc / hosts.

Ви можете підтвердити ваш мережевий IP (inet end.) За допомогою:

$ifconfig

Перевірте, чи відповідає Ваша IP-адреса файлу / etc / hosts:

$cat /etc/hosts

Відредагуйте файл / etc / hosts, якщо введено:

$sudo gedit /etc/hosts

До побачення.


2
це старе, але не має сенсу додавати свій IP-адресу до / etc / hosts. В ОП відсутня SERVICE_NAME, інші речі досить непов’язані
Остап

Я не додав свій IP до / etc / host. Я просто виправив це. Як ви бачите в цій темі, для вирішення цього питання існує безліч дійсних відповідей та варіантів. Якщо ця відповідь не допомогла вам, то чому блукати? Ця відповідь все одно може допомогти комусь, як і мені.
Sergio MC Figueiredo

2

Для тих, хто може запускати Oracle у віртуальній машині (як я), я бачив цю проблему, оскільки у моєї віртуальної машини не вистачало пам’яті, що, схоже, завадило OracleDB запуститись / запуститись належним чином. Збільшення моєї пам'яті VM та перезапуск вирішили проблему.


2

Тут багато відповідей, але ось робочий приклад з кодом, який ви можете скопіювати, вставити та протестувати негайно:

Для мене помилка 12514 була вирішена після вказівки правильного SERVICE_NAME. Ви виявите, що на сервері у файлі, tnsnames.oraякий поставляється з 3 заздалегідь визначеними іменами служби (одне з них - "XE").

  1. Я встановив базу даних Oracle Express OracleXE112, яка вже постачається з деякими попередньо встановленими демонстраційними таблицями.
  2. Коли ви запускаєте інсталятор, вам буде запропоновано пароль. Я ввів "xxx" як пароль. (не використовується у виробництві)
  3. Мій сервер працює на машині 192.168.1.158
  4. На сервері потрібно чітко дозволити доступ до процесу TNSLSNR.exe у брандмауері Windows. Цей процес прослуховується в порту 1521.
  5. ВАРІАНТ A: Для C # (.NET2 або .NET4) ви можете завантажити ODAC11 , з якого потрібно додати Oracle.DataAccess.dll до свого проекту. Додатково ця DLL залежить від: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Цей DLL повинен бути в тому ж каталозі, що і EXE або ви повинні вказати шлях DLL в: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. На 64-бітних машинах додатково пишуть наHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. ВАРІАНТ B: Якщо ви завантажили ODAC12, вам потрібні Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160MB!), Oraons.dll, msvcr100.dll. Шлях до реєстру єHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. ВАРІАНТ C: Якщо ви не хочете, щоб величезні DLL-файли перевищували 100 Мб, вам слід завантажити ODP.NET_Managed12.xxxxxxxx.zip, у якому ви виявите, Oracle.ManagedDataAccess.dllщо лише 4 Мб, і є чисто керованою DLL, яка працює в 32-бітних та 64-бітних процесах а також залежить від жодної іншої DLL і не потребує жодних записів реєстру.
  8. Наступний код C # працює для мене без будь-якої конфігурації на стороні сервера (лише встановлення за замовчуванням):
використання Oracle.DataAccess.Client;
або
використання Oracle.ManagedDataAccess.Client;

….

string oradb = "Джерело даних = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));"
    + "User ID = SYSTEM; Пароль = xxx;";

використовуючи (OracleConnection conn = новий OracleConnection (oradb)) 
{
    conn.Open ();
    використовуючи (OracleCommand cmd = новий OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "вибрати TABLESPACE_NAME з DBA_DATA_FILES";

        використовуючи (OracleDataReader dr = cmd.ExecuteReader ())
        {
            поки (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Якщо SERVICE_NAME=XEпомилка неправильна, ви отримуєте помилку 12514. Файл SERVICE_NAMEнеобов’язковий. Ви також можете залишити його подалі.


Велике спасибі, з вашого рішення я знайшов хитрість, в моєму випадку саме антивірус блокував програму, отже, не вдалося отримати з'єднання з Oracle db.
robot_alien

2

Я також стикався з тією ж проблемою і витратив 3 дні, щоб викопати її.

Це трапляється через неправильну запис послуги TNS.

Спочатку перевірте, чи зможете ви підключитися до бази даних в режимі очікування з первинної бази даних за допомогою sql> sqlplus sys@orastand as sysdba( orastandце база даних в режимі очікування).

Якщо ви не в змозі підключитися, це проблема з сервісом. Виправте введення імені служби у файл TNS на первинному кінці.

Аналогічно перевіряйте базу даних у режимі очікування. Внесіть зміни і тут, якщо потрібно.

Переконайтесь, що log_archive_dest_2параметр має правильну назву послуги.


1

Я отримав таку ж помилку, оскільки вказаний віддалений SID був неправильним:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

Я запитав системну базу даних:

виберіть * від global_name;

і знайшов мій віддалений SID ("XE").

Тоді я міг би без проблем підключитися.


0

У моєму випадку в базі даних не вистачало місця на диску. Що змусило його не реагувати. Після того, як я прояснив це питання, все працювало знову.


Як я можу це дізнатися?
CodeSlave

0

Для мене це було викликано використанням динамічної ipadress за допомогою установки. Я перевстановив Oracle за допомогою статичної ipadress і тоді все було добре



0

Мою проблему було вирішено, замінивши URL-адресу "SID" на "ім'я служби" та правильний хост.


0

tnslsnr працює, але база даних знижена.

Для новачків Oracle не очевидно, що база даних може бути відключена під час прийняття з'єднань.

Мені довелося запускати базу даних вручну

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

А потім в sql консолі

startup

У моєму випадку я не зміг запустити, але отримав ще одне повідомлення про помилку і знайшов джерело проблеми - мені довелося змінити ім'я хоста, а потім автоматичний запуск бази даних знову функціонував.


0

Я вирішив цю проблему нижче, щоб вирішити цю проблему.

  1. Я встановив ORACLE_HOME за допомогою командного рядка (клацніть правою кнопкою миші cmd.exe і запустіть як системний адміністратор).

  2. Використовується нижче команда

    set oracle_home="path to the oracle home"

  3. Перейдіть у розділ Усі програми -> Oracle -ora home1 -> Інструменти міграції конфігурації -> Менеджер мережі -> Слухач

  4. Виберіть Служби баз даних зі спадного меню. І ім’я глобальної бази даних, і SID встановлені однаково (ORCL в моєму випадку). Встановити домашній каталог Oracle.

Приклад вікна Oracle Net Manager з документації на oracle: Приклад Oracle Net Manager

  1. Клацніть на Файл та збережіть мережеву конфігурацію.

0

Проблема полягала в тому, що мій URL-адрес рядка підключення містив ім'я бази даних замість SID. Заміна імені бази даних на підключення до бази даних Oracle SID вирішила цю проблему.

Щоб дізнатися про SID-оракули Oracle, ви можете переглянути tnsnames.oraфайл.

XE був фактичним SID, тому ось як виглядає зараз моя рядка з'єднання tomcat:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

Моя версія сервера була "Oracle 11.2 Express", але рішення повинно працювати і на інших версіях.


0

У моєму випадку круглі дужки навколо SERVICE_NAME відсутні у файлі tnsnames.ora .

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

0

Для тіз, які використовують для підключення spring-boot та jdbc. Ви повинні бути обережними під час написання jdbcUrl у application.properties

Із SID у базі даних - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Ім'я служби у db-з'єднанні globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Це працювало для мене :)

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