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
Я сделал ниже, чтобы решить эту проблему.
У меня был установлен оракул в моем диске D:.
- И перейти ко всем программам → Oracle -ora home1 → Инструменты настройки конфигурации
Net Manager → Listener → выберите Database Services из выпадающего меню → Имя глобальной базы данных и SID оба установлены одинаково, в моем случае это ORCL, установите каталог oracle_home. Нажмите "Файл" и сохраните конфигурацию сети.