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

183

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

ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

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

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

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

the TNS Listener on the server is running. Oracle itself on the server is running.

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

Какую команду TNSPing (с параметрами) вы использовали? Grzegorz W
ALTER SYSTEM REGISTER менее радикальна, чем перезапуск базы данных. DCookie
попробуйте перезапустить базу данных. Поскольку они должны сообщать Слушателю об их существовании при запуске, это может решить вашу проблему. Jens Schauder
когда вы говорите «работает локально», вы имеете в виду, что приложение подключается к базе данных на том же хосте? Кроме того, каково содержимое вашего файла sqlnet.ora? какие версии указаны для sqlplus и tnsping, и вы уверены, что они находятся в одном и том же ORACLE_HOME? David Aldridge

Ваш Ответ

17   ответов
2

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

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

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

2

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

171

и ее нужно было исправить вtnsnames.ora theSERVICE_NAME является действительным именем службы в вашей базе данных. Чтобы узнать действительные имена сервисов, вы можете использовать следующий запрос в Oracle:

select value from v$parameter where name='service_names'

Как только я обновилtnsnames.ora to:

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

тогда я побежал:

sqlplus [email protected]

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

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

Большое спасибо, вы решили мою проблему;) Но где находится tnsnames.ora? Breeze
На win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora Brad Rippe
Как я могу запросить базу данных, если я не могу даже подключиться к ней ?? isabelle martz
Можете ли вы напрямую подключиться к серверу БД и запустить оттуда sqlplus? Brad Rippe
ORA-00942: таблица или представление не существует Tommy Holman
32

что это старый вопрос, но все еще без ответа. Мне потребовался целый день исследований, но я нашел самое простое решение, по крайней мере, в моем случае (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))
    )
  )
когда все остальное не удалось, это должно помочь мне. tjeloep
Я думаю, что это правильный ответ Benny
Нужно обновить этот ответ синтаксисом того, какlistener.ora хранит имена. У меня даже нетlistener.ora файл. Я также на клиентской рабочей станции, на которой работает SQL Developer и пытаюсь просто создать ссылку на базу данных, когда я получаю сообщение об ошибке. У меня нет службы прослушивания Oracle для перезапуска. vapcguy
vapcguy, вы должны быть на сервере базы данных. это звучит как ты на клиенте Joseph Argenio
Этот сделал это для меня! Pablo Santa Cruz
2

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

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

Windows Server 2008 R2 а такжеOracle 11g

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

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

8

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

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

Выполнено

4

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

2

я просто писал

sqlplus myusername/[email protected]

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

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

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

2

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

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

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

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

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

1

обновив IP-адрес моей машины в файле / etc / hosts.

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

$ifconfig

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

$cat /etc/hosts

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

$sudo gedit /etc/hosts

До свидания

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

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

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

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

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

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

select * из global_name;

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

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

0

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

-1

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

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

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

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

Похожие вопросы