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

У нас есть приложение, работающее локально, где мы видим следующую ошибку:

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

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

sqlplus username/password@addressname[or host name]

Мы убедились, что:

  • Слушатель TNS на сервере работает.
  • Сам Oracle на сервере работает.

Мы не знаем о каких-либо изменениях, которые были внесены в эту среду. Что-нибудь еще мы можем проверить?

31 ответ

Решение

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

Я знаю, что это старый вопрос, но все еще без ответа. Это заняло у меня целый день исследований, но я нашел самое простое решение, по крайней мере, в моем случае (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))
    )
  )

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

Мой дескриптор в 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

Готово!

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

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

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

Это действительно должен быть комментарий к Brad Rippe, но, увы, недостаточно реп. Этот ответ дал мне 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] вместо панели управления службами, но оба работают.) После этого я смог подключиться.

Для тех, кто использует 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

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

Запуск OracleServiceXXX из services.msc работал для меня в Windows.

Для пользователей Dbeaver: попробуйте выбрать «SID» вместо «Имя службы» в настройках подключения.

У меня была такая же проблема, для меня просто пишу

sqlplus myusername/mypassword@localhost

сделал трюк, делая это делает его подключиться к имени службы по умолчанию, я думаю.

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

Вы можете скачать инструмент с сайта оракула Sql Developer

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

Я также столкнулся с той же проблемой и потратил 3 дня, чтобы выкопать ее. Это происходит из-за неправильной записи службы TNS. Сначала проверьте, можете ли вы подключиться к резервной базе данных из первичной базы данных, используя sql > sqlplus sys@orastand в качестве sysdba ( orastand - резервная база данных), если вы не можете подключиться, то это проблема со службой. Исправьте запись имени службы в файле TNS на первичном конце. Проверьте то же самое в резервной базе данных, если необходимо, внесите изменения и здесь. и убедитесь, что логарифм log_archive_dest_2 имеет правильное имя сервиса.

Я решил эту проблему в своей среде linux, обновив IP-адрес моей машины в файле /etc/hosts.

Вы можете проверить свой сетевой IP (конец inet):

$ifconfig

Посмотрите, совпадает ли ваш IP с файлом /etc/hosts:

$cat /etc/hosts

Отредактируйте файл /etc/hosts, если он подключен:

$sudo gedit /etc/hosts

До свидания.

То, что работало для меня, было действительно простым, мне просто нужно было вручную запустить службу в "Службах Windows" (services.msc в cmd trompt). мое сервисное имя: OracleServiceXXXXX.

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

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

Для меня ошибка 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. ВАРИАНТ 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 = "Источник данных =(ОПИСАНИЕ ="
    + "(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 на виртуальной машине (например, я), я видел эту проблему, потому что моей виртуальной машине не хватало памяти, что, по-видимому, препятствовало правильному запуску / работе OracleDB. Увеличение моей виртуальной памяти и перезапуск исправили проблему.

Я получил ту же ошибку, потому что указан неверный SID:

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

Я запросил системную базу данных:

выберите * из global_name;

и нашел мой удаленный SID ("XE").

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

В моем случае круглые скобки вокруг 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))

В моем случае в базе данных не хватило места на диске. Что заставило его не отвечать. Как только я решил эту проблему, все снова заработало.

Мне нужно было просто заменить строку подключения

от:

      jdbc:oracle:thin:@localhost:1521:xe

К:

      jdbc:oracle:thin:@localhost:1521:orcl

Сначала я получил ту же ошибку при весенней загрузке. Я дал URL-адрес как Spring.datasource.url=jdbc:oracle:thin:@localhost:1521:TEST_DB

но дайте URL как

Spring.datasource.url=jdbc:oracle:thin:@localhost:1521/ORCL

это решило мою проблему

Проблема может быть в неправильном URL.

Например, я использую базу данных Oracle (внутри виртуальной машины) со средой Spring и имею эту проблему.

В моем файле application.properties было:

      spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orcl12c

Но версия db была другой:

      spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/orclcdb

Правильный URL-адрес можно найти в файле tnsnames.ora (этот файл будет доступен на сервере Oracle, поэтому, если вы используете виртуальную машину , вам следует искать этот файл внутри вашей хост-виртуальной машины). Например, для Oracle в VirtualBox команда для просмотра этого файла:

      nano /u01/app/oracle/product/version/db_1/network/admin/tnsnames.ora

В моем случае для среды Linux файл oracle по адресу был выделен красным цветом с различными разрешениями, как показано ниже:

Я изменил права доступа к этому файлу, как показано ниже:

1) Остановить Oracle -> sudo systemctl stop oracle.service
2) Измените разрешение файла оракула на ORACLE_HOME/binкаталог как " sudo chmod 777 oracle "
3) Запустите Oracle -> sudo systemctl start oracle.service

Затем, после этого изменения, я проверил статус слушателя с помощью lsnrctl status. Здесь я вижу, что экземпляры db загружены успешно.

Примечание: сделайте резервную копию файла oracle перед изменением разрешений.

Перезапуск ВМ работал на меня

Я сделал ниже работы вокруг, чтобы решить эту проблему.

  1. Я установил oracle_home в командной строке cmd (щелкните правой кнопкой мыши cmd.exe Запуск от имени системного администратора). используется ниже команды

    set oracle_home="путь к дому оракула"

У меня был установлен оракул на моем диске D:.

  1. И Перейти ко всем программам -> Oracle - или home1 -> Инструменты миграции конфигурации Net Manager -> Прослушиватель -> в раскрывающемся списке "Службы баз данных" -> Глобальное имя базы данных и SID. В моем случае оба значения одинаковы. ORCL, установите каталог oracle_home. Нажмите Файл и сохраните конфигурацию сети.

Для меня это было вызвано использованием динамического ipadress с использованием установки. Я переустановил Oracle, используя статический ipadress, и тогда все было хорошо

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

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

Мне пришлось запускать базу данных вручную вот так

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

А затем в консоли sql

startup

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

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

Я поместил SID в поле "База данных", а в раскрывающемся списке рядом с полем у меня было значение "Имя службы" вместо значения "SID".
(обычно я не использую базу данных Oracle, поэтому не осознавал разницы)

Вот почему я получил сообщение об ошибке.

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

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

Другие вопросы по тегам