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
попробуйте перезапустить базу данных. Так как они должны сообщить Слушателю об их существовании при запуске, это может решить вашу проблему.
Йенс Шаудер

1
ALTER SYSTEM REGISTER менее радикальна, чем перезапуск базы данных.
DCookie

Ответы:


210

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


2
На win7% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Брэд Риппе

198
Как я могу запросить БД, если я не могу даже подключиться к ней?
Изабель Марц

2
Можете ли вы напрямую подключиться к серверу БД и запустить оттуда 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 и имен сервисов в паре в формате, который вы можете скопировать или найти.

Я добавил проблему Service Name, затем в панели управления 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, касающимся сетевого менеджера, я заметил, что мой файл listeners.ora был обновлен и теперь содержит новую запись SID_LIST. Я отредактировал этот ответ, чтобы включить пример синтаксиса «до и после» для читателей, которые по какой-либо причине не могут использовать Net Manager.
Кевин

12

У меня была эта проблема на Windows Server 2008 R2 и Oracle 11g

перейдите в Net Manager> Слушатель> выберите службы баз данных из поля со списком> «Глобальное имя базы данных» должно совпадать с «SID», а «Oracle Home Directory» должен быть правильным.

Если у вас нет записей для служб баз данных, создайте их и задайте правильную глобальную базу данных sidи oracle home.


12

В моих обстоятельствах ошибка была связана с тем, что у слушателя не была зарегистрирована служба БД. Я решил это путем регистрации услуг. Пример:

Мой дескриптор в 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 Database Configuration Assistant, где изначально:

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 в cmd trompt). мое сервисное имя: OracleServiceXXXXX.


В моем случае, хотя Тип запуска установлен на Автоматический, он не запускается при загрузке компьютера. После запуска вручную службы «OracleServiceXE» она работает с Oracle Database 11g Express для подключения к БД и веб-странице APEX (Oracle Application Express).
Иван Чау

2

Проверьте, что база данных работает. Войдите на сервер, задайте для переменной среды ORACLE_SID SID базы данных и запустите SQL * Plus в качестве локального соединения.


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

2

Эта ошибка может возникать, когда приложение устанавливает новое соединение для каждого взаимодействия с базой данных или соединения не закрываются должным образом. Одним из бесплатных инструментов для мониторинга и подтверждения этого является Oracle Sql developer (хотя это не единственный инструмент, который вы можете использовать для мониторинга сеансов БД).

Вы можете скачать инструмент с сайта оракула 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. Я просто исправил это. Как вы можете видеть в этой теме, есть много действительных (с upvote) ответов и вариантов для решения этого вопроса. Если этот ответ не помог вам, зачем понижать голос? Этот ответ все еще может помочь кому-то, поскольку он помог мне.
Sergio MC Figueiredo

2

Для тех, кто может использовать Oracle на виртуальной машине (например, я), я видел эту проблему, потому что моей виртуальной машине не хватало памяти, что, по-видимому, препятствовало правильному запуску / запуску OracleDB. Увеличение моей виртуальной памяти и перезапуск исправили проблему.


2

Здесь много ответов, но вот рабочий пример с кодом, который можно сразу скопировать, вставить и протестировать:

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

  1. Я установил базу данных Oracle Express OracleXE112, которая уже поставляется с некоторыми предварительно установленными демонстрационными таблицами.
  2. При запуске установщика у вас спрашивают пароль. Я ввел "ххх" в качестве пароля. (не используется в производстве)
  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 (130 МБ!), 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 (160 МБ!), Oraons.dll, msvcr100.dll. Путь к рееструHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. ВАРИАНТ В: Если вам не нужны огромные библиотеки 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)));"
    + "Идентификатор пользователя = SYSTEM; Пароль = xxx;";

использование (OracleConnection conn = новый OracleConnection (oradb)) 
{
    conn.Open ();
    использование (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "выбрать TABLESPACE_NAME из DBA_DATA_FILES";

        использование (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (д-р [ "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

Моя проблема была решена путем замены 'SID' в URL на 'имя службы' и правильный хост.


0

tnslsnr вверх, но база данных не работает.

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

Я должен был запустить базу данных вручную, как это

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 -> Инструменты миграции конфигурации -> Net Manager -> Слушатель

  4. Выберите Database Services из выпадающего списка. И глобальное имя базы данных, и SID установлены одинаково (ORCL в моем случае). Установить домашний каталог Oracle.

Пример окна Oracle Net Manager из документации Oracle: Пример Oracle Net Manager

  1. Нажмите Файл и сохраните конфигурацию сети.

0

Проблема заключалась в том, что URL-адрес строки подключения содержал имя базы данных вместо SID. Замена имени базы данных на соединение с базой данных оракула SID решила эту проблему.

Чтобы узнать ваш SID оракула, вы можете просмотреть 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

В моем случае в файле tnsnames.ora отсутствовали круглые скобки вокруг SERVICE_NAME .

<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

С именем службы в подключении к БД globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Это сработало для меня :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.