У нас есть приложение, работающее локально, где мы испытываем следующую ошибку:
ORA-12514: TNS: слушатель в настоящее время не знает о запрошенной услуге в дескрипторе соединения
Я тестировал соединение, используя TNSPing
, который правильно и
Я попробовал SQLPlus
, чтобы попробовать подключиться, что не удалось с той же ошибкой, что и выше. Я использовал этот синтаксис для SQLPlus
:
sqlplus username/password@addressname[or host name]
Мы проверили, что:
Мы не знаем никаких изменений, которые были внесены в эту среду. Что-нибудь еще, что мы можем проверить?
У меня была эта проблема, и исправление заключалось в том, чтобы убедиться, что в 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 и имен служб спарен в формате, который вы можете скопировать или найти.
Я добавил проблемное имя службы, а затем в панель управления Windows "Службы" я сделал "Перезапуск" в службе прослушивателя Oracle. Теперь все хорошо.
У меня была эта проблема на сервере Windows 2008 R2 и Oracle 11g
перейдите в Net Manager > Listener > выберите службы базы данных из combox > "Глобальное имя базы данных" должно быть таким же, как "SID" и "Oracle Home Directory" должны быть правильными.
Если у вас нет какой-либо записи для служб баз данных, создайте ее и установите правильную глобальную базу данных, sid
и oracle home.
Запуск OracleServiceXXX из services.msc работал у меня в Windows.
В моих обстоятельствах ошибка была вызвана тем фактом, что слушатель не имел зарегистрированной службы 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
Готово!
На самом деле это должен быть комментарий к 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, но обе работают.) После этого я смог подключиться.
У меня была та же проблема, для меня просто пишу
sqlplus myusername/mypassword@localhost
сделал трюк, поэтому он подключается к имени службы по умолчанию, которое я предполагаю.
jdbc:oracle:thin:@//localhost:1521/orcl
. Исправленная строка подключения для устранения этой ошибки: jdbc:oracle:thin:@localhost:1521
.
Я также столкнулся с такой же проблемой и потратил 3 дня, чтобы выкопать ее. Это происходит из-за неправильной записи службы TNS. Сначала проверьте, можете ли вы подключиться к резервной базе данных из первичной базы данных, используя sql > sqlplus sys @orastand as sysdba (orastand - резервная база данных), если вы не можете подключиться, это проблема с сервисом. Исправьте запись имени службы в файле TNS на начальном конце. Проверьте этот режим в резервной базе данных, если требуется внести изменения и здесь. и убедитесь, что parmater log_archive_dest_2 имеет правильное имя службы.
Эта ошибка может возникать, когда приложение создает новое соединение для каждого взаимодействия с базой данных или соединения не закрываются должным образом. Одним из бесплатных инструментов для мониторинга и подтверждения этого является разработчик Oracle Sql (хотя это не единственный инструмент, который вы можете использовать для мониторинга сеансов DB).
вы можете загрузить инструмент с сайта oracle Sql Developer
вот скриншот о том, как контролировать сеансы. (если вы видите много сеансов, накапливающихся для вашего пользователя приложения во время просмотра ошибки ORA-12514, то это хороший признак того, что у вас может быть проблема пула соединений).
Проверьте, что база данных обновлена. Войдите на сервер, установите переменную среды ORACLE_SID в SID базы данных и запустите SQL * Plus в качестве локального соединения.
Здесь много ответов, но здесь приведен рабочий пример с кодом, который вы можете скопировать и вставить и протестировать сразу:
Для меня ошибка 12514 была решена после указания правильного SERVICE_NAME.
Вы обнаружите, что на сервере в файле tnsnames.ora
, который поставляется с тремя предопределенными именами служб (один из них - "XE" ).
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath
. На 64-битных машинах дополнительно записывать HKLM\SOFTWARE\Wow6432Node\Oracle\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
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
не является обязательным. Вы также можете оставить его.
то, что сработало для меня, было очень просто, мне просто нужно было запустить сервис вручную в "Служб Windows" (services.msc в cmd trompt). мое имя службы: OracleServiceXXXXX.
Для тех, кто может работать с Oracle в виртуальной машине (например, я), я видел эту проблему, потому что у моей VM не хватало памяти, что, похоже, помешало OracleDB правильно запущен/запущен. Увеличение памяти VM и перезапуск исправили проблему.
Я решил эту проблему в среде linux, обновляя IP-адрес моей машины в файле /etc/hosts.
Вы можете проверить свой IP-адрес сети (inet end.) с помощью
$ifconfig
Посмотрите, совпадает ли ваш IP файл с файлом /etc/hosts:
$cat /etc/hosts
Отредактируйте файл /etc/hosts, если nedded:
$sudo gedit /etc/hosts
Bye.
В моем случае в базе данных закончилось дисковое пространство. Это заставило его не отвечать. Как только я выяснил эту проблему, все снова работало.
Я сделал ниже, чтобы решить эту проблему.
Я установил oracle_home в подсказке cmd (щелкните правой кнопкой мыши cmd.exe Запуск от имени системного администратора). используется ниже команды
установить oracle_home = "путь к дому оракула"
У меня был установлен оракул в моем диске D:.
Я получил ту же ошибку, потому что указанный удаленный идентификатор безопасности был неправильным:
> sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID
Я запросил системную базу данных:
выберите * из global_name;
и нашел мой удаленный SID ( "XE" ).
Тогда я мог бы подключиться без каких-либо проблем.
Для меня это было вызвано использованием динамического ipadress с использованием установки. Я переустановил Oracle, используя статический ipadress, и тогда все было в порядке
Если вы получили это сообщение об ошибке, но не успешно выполнили TNSPing, как это делали OP, попробуйте эти инструкции для как запустить Oracle и слушателей.