it-roy-ru.com

Ошибка SQLPLUS: ORA-12504: TNS: слушателю не было присвоено имя SERVICE_NAME в CONNECT_DATA

Я скачал SQLPLUS из Oracle:

http://www.Oracle.com/technetwork/topics/winx64soft-089540.html

Basic Lite и SQL * Plus

Затем я запустил SQL * Plus:

c:\Program Files\Oracle\instantclient_12_1>sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 15 15:25:36 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

и попытался подключиться к базе данных:

connect user\[email protected]

и получил сообщение об ошибке:

ERROR:
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

Что мне не хватает?

Я выполнил запросы, предложенные Якубом, я получил

SQL> select sys_context('USERENV','SERVICE_NAME') from dual;

SYS_CONTEXT('USERENV','SERVICE_NAME')
--------------------------------------------------------------------------------

SYS$USERS

SQL> select sys_context('USERENV','SID') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------

877

SQL>
14
gbritton

Вы пропустили название сервиса:

 SQL> connect username/[email protected]:port/SERVICENAME

ПРАВКА

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

select sys_context('USERENV','SERVICE_NAME') from dual

а также

select sys_context('USERENV','SID') from dual
16
jakub.petr

Я столкнулся с точно такой же проблемой при идентичных обстоятельствах. У меня нет файла tnsnames.ora, и я хотел использовать SQL * Plus с форматом Easy Connection Identifier в командной строке. Я решил эту проблему следующим образом.

Руководство пользователя и справка по SQL * Plus® приводит пример:

sqlplus hr @\"sales-server: 1521/sales.us.acme.com \"

Обратите внимание на два важных момента:

  1. Идентификатор соединения указан в кавычках. У вас есть два варианта:
    1. Вы можете использовать команду SQL * Plus CONNECT и просто передать строку в кавычках.
    2. Если вы хотите указать параметры соединения в командной строке, вы должны добавить обратную косую черту в качестве экранов перед кавычками. Он инструктирует bash передавать кавычки в SQL * Plus.
  2. Имя службы должно быть указано в FQDN-форме, как это настроено вашим администратором баз данных. 

Я нашел эти хорошие вопросы для определения имени сервиса через существующее соединение: 1 , 2 . Попробуйте этот запрос, например:

SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES'
12
alexeionin

Просто небольшое замечание: вы продолжаете упоминать conn usr\pass, и это опечатка, верно? Потому что это должно быть conn usr/pass. Или это отличается от ОС на основе Unix?

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

tnsnames.ora должен находиться в $ Oracle_HOME $\network\admin. Это дом Oracle на компьютере, к которому вы пытаетесь подключиться, так что в вашем случае это ваш компьютер. Если у вас есть несколько Oracle_homes и вы хотите использовать только один tnsnames.ora, вы можете установить переменную окружения tns_admin (например, установить TNS_ADMIN = c:\Oracle\tns) и поместить tnsnames.ora в этот каталог.

Ваш оригинальный метод входа в систему (usr/[email protected]: port/servicename) должен всегда работать. До сих пор я думаю, что у вас есть вся информация, кроме номера порта, который, я уверен, ваш администратор базы данных сможет вам дать. Если этот метод по-прежнему не работает, либо IP-адрес сервера недоступен у вашего клиента, либо это проблема с брандмауэром (блокировка определенного порта), либо что-то еще, не связанное (напрямую) с Oracle или SQL * Plus.

нТН! С уважением, РЕМКО

0
Remco