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

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

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

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

sqlplus username/[email protected][or host name]

Мы проверили, что:

  • Слушатель TNS на сервере запущен.
  • Сам Oracle на сервере запущен.

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

Ответ 1

У меня была эта проблема, и исправление заключалось в том, чтобы убедиться, что в 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 [email protected]

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

(* Я запускал sqlplus из клиентской рабочей станции Win7 для удаленного БД и обвинял администраторов баз данных;) *)

Ответ 2

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

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

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

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

Ответ 4

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

Готово!

Ответ 5

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

Ответ 6

На самом деле это должен быть комментарий к Brad Rippe, но, увы, не хватает репутации. Этот ответ дал мне 90% пути. В моем случае установка и настройка баз данных помещали записи в файл tnsnames.ora для баз данных, которые я запускал. Во-первых, я смог подключиться к базе данных, установив переменные среды (Windows):

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

а затем соединение с помощью

sqlplus / as sysdba

Затем, запустив команду из Brad Rippe, ответьте:

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

Ответ 7

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

Ответ 8

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

вы можете загрузить инструмент с сайта oracle Sql Developer

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

enter image description here

Ответ 9

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

Ответ 10

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

Вы можете проверить свой IP-адрес сети (inet end.) с помощью

$ifconfig

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

$cat /etc/hosts

Отредактируйте файл /etc/hosts, если nedded:

$sudo gedit /etc/hosts

Bye.

Ответ 11

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

sqlplus myusername/[email protected]

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

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

  • Я установил базу данных Oracle Express OracleXE112, которая уже поставляется с предустановленными демонстрационными таблицами.
  • Когда вы запустите программу установки, вас попросят ввести пароль. Я ввел "xxx" в качестве пароля. (не используется в производстве)
  • Мой сервер работает на компьютере 192.168.1.158
  • На сервере вы должны явно разрешить доступ к процессу TNSLSNR.exe в брандмауэре Windows. Этот процесс прослушивает порт 1521.
  • ВАРИАНТ A:. Для С# (.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\...
  • ВАРИАНТ 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
  • OPTION C: Если вам не нужна огромная DLL более 100 МБ, вы должны скачать ODP.NET_Managed12.xxxxxxxx.zip, в которой вы найдете Oracle.ManagedDataAccess.dll, который составляет всего 4 МБ и представляет собой чистую управляемую DLL, которая также работает в 32-битных и 64-битных процессах и не зависит от какой-либо другой DLL и не требует каких-либо записей в реестре.
  • Следующий код С# работает для меня без какой-либо конфигурации на стороне сервера (только установка по умолчанию):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(DESCRIPTION="
    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));"
    + "User Id=SYSTEM;Password=xxx;";

using (OracleConnection conn = new OracleConnection(oradb)) 
{
    conn.Open();
    using (OracleCommand cmd = new OracleCommand())
    {
        cmd.Connection  = conn;
        cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES";

        using (OracleDataReader dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                listBox.Items.Add(dr["TABLESPACE_NAME"]);
            }
        }
    }
}

Если ошибка SERVICE_NAME=XE неверна, вы получаете ошибку 12514. SERVICE_NAME не является обязательным. Вы также можете оставить его.

Ответ 15

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

Ответ 16

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

 > sqlplus $DATASOURCE_USERNAME/[email protected]$DB_SERVER_URL/$REMOTE_SID 

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

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

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

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

Ответ 17

Если вы получили это сообщение об ошибке, но не успешно выполнили TNSPing, как это делали OP, попробуйте эти инструкции для как запустить Oracle и слушателей.

Ответ 18

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

Ответ 19

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

Ответ 20

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

Ответ 21

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

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

    установить oracle_home = "путь к дому оракула"

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

  1. И перейти ко всем программам → Oracle -ora home1 → Инструменты настройки конфигурации Net Manager → Listener → выберите Database Services из выпадающего меню → Имя глобальной базы данных и SID оба установлены одинаково, в моем случае это ORCL, установите каталог oracle_home. Нажмите "Файл" и сохраните конфигурацию сети.