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

122

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

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

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

sqlplus username/password@addressname[or host name]

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

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

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

  • 2
    Какую команду TNSPing (с параметрами) вы использовали?
  • 0
    когда вы говорите «работает локально», вы имеете в виду, что приложение подключается к базе данных на том же хосте? Кроме того, каково содержимое вашего файла sqlnet.ora? какие версии указаны для sqlplus и tnsping, и вы уверены, что они находятся в одном и том же ORACLE_HOME?
Показать ещё 2 комментария
Теги:
sqlplus
oracle11g
tnsping

19 ответов

134
Лучший ответ

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

  • 0
    Большое спасибо, вы решили мою проблему;) Но где находится tnsnames.ora?
  • 1
    На win7% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Показать ещё 7 комментариев
21

Я знаю, что это старый вопрос, но все еще без ответа. Мне потребовался день исследований, но я нашел самое простое решение, по крайней мере, в моем случае (Oracle 11.2 на Windows 2008 R2) и хотел поделиться.

Ошибка, если смотреть прямо, указывает, что слушатель не распознает имя службы. Но где он хранит имена сервисов? В %ORACLE_HOME%\NETWORK\ADMIN\listener.ora

"SID_LIST" - это только то, что список идентификаторов SID и имен служб спарен в формате, который вы можете скопировать или найти.

Я добавил проблемное имя службы, а затем в панель управления Windows "Службы" я сделал "Перезапуск" в службе прослушивателя Oracle. Теперь все хорошо.

  • 1
    когда все остальное не удалось, это должно помочь мне.
  • 3
    Я думаю, что это правильный ответ
Показать ещё 4 комментария
8

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

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

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

3

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

  • 0
    Запуск OrcaleRemExecServiceV2 помог мне.
  • 0
    В Windows, если вы используете Oracle Release 12.x, убедитесь, что служба OracleServiceORCL запущена. Если эта служба не запущена, то вы также получите тот же код ошибки.
2

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

Готово!

2

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

2

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

sqlplus myusername/mypassword@localhost

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

  • 1
    У нас была похожая проблема с нашей строкой соединения, вызывающая эту ошибку. Мы подключались, используя тонкий драйвер Oracle JDBC со строкой подключения: jdbc:oracle:thin:@//localhost:1521/orcl . Исправленная строка подключения для устранения этой ошибки: jdbc:oracle:thin:@localhost:1521 .
  • 0
    это зависит от того, будет ли это работать - я думаю, что этот способ подключения, судя по тому, что говорили другие, полностью обходит слушателя, используя имя хоста компьютера вместо SID - этот способ подключения вызывает проблемы у сторонних клиентов, - я думаю, это также работает, только когда EZCONNECT указан в sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
2

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

2

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

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

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

Изображение 7132

2

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

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

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

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

  • 0
    Большое спасибо, из вашего решения я нашел хитрость, в моем случае это был антивирус, который блокировал программу, и, следовательно, не смог получить соединение с Oracle db.
1

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

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

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

1

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

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

$ifconfig

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

$cat /etc/hosts

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

$sudo gedit /etc/hosts

Bye.

  • 1
    это старый, но нет смысла добавлять ваш IP в / etc / hosts. OP отсутствует SERVICE_NAME, другие вещи совершенно не связаны
  • 0
    Я не добавил свой IP в / etc / host. Я просто исправил это. Как вы можете видеть в этой теме, есть много действительных (с upvote) ответов и вариантов для решения этого вопроса. Если этот ответ не помог вам, зачем понижать голос? Этот ответ все еще может помочь кому-то, поскольку он помог мне.
1

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

0

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

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

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

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

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

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

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

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

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

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

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

0

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню