Ошибка SQLPLUS: ORA-12504: TNS: слушателю не было сообщено SERVICE_NAME в CONNECT_DATA
Я загрузил SQLPLUS из Oracle:
http://www.oracle.com/technetwork/topics/winx64soft-089540.html
Основные 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>
Ответы
Ответ 1
Вам не присвоено имя службы:
SQL> connect username/[email protected]:port/SERVICENAME
ИЗМЕНИТЬ
Если вы можете подключиться к базе данных с другого компьютера, попробуйте запустить там:
select sys_context('USERENV','SERVICE_NAME') from dual
и
select sys_context('USERENV','SID') from dual
Ответ 2
Я столкнулся с одной и той же проблемой при одинаковых обстоятельствах. У меня нет файла tnsnames.ora, и я хотел использовать SQL * Plus с форматом Easy Connection Identifier в командной строке. Я решил эту проблему следующим образом.
Руководство пользователя и справочник SQL * Plus® дает пример:
sqlplus hr @\ "sales-server: 1521/sales.us.acme.com \"
Обратите внимание на два важных момента:
- Идентификатор соединения указан. У вас есть два варианта:
- Вы можете использовать команду SQL * Plus CONNECT и просто передать цитированную строку.
- Если вы хотите указать параметры подключения в командной строке, вы должны добавить обратную косую черту в качестве щита перед кавычками. Он инструктирует bash передать кавычки в SQL * Plus.
- Имя службы должно быть указано в FQDN-форме, так как оно настроено вашим администратором базы данных.
Я нашел эти хорошие вопросы для определения имени службы через существующее соединение: 1, 2. Попробуйте выполнить этот запрос, например:
SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES'
Ответ 3
Просто небольшое наблюдение: вы продолжаете упоминать 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/pwd @10.15.240.13: port/servicename) должен всегда работать. Пока я думаю, что у вас есть вся информация, кроме номера порта, и я уверен, что ваш администратор базы данных сможет вам дать. Если этот метод по-прежнему не работает, либо IP-адрес сервера недоступен для вашего клиента, либо это проблема межсетевого экрана (блокировка определенного порта) или что-то еще (напрямую) не связанное с Oracle или SQL * Plus.
НТН!
С Уважением,
Ремко