Подтвердить что ты не робот

Ошибка 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>
4b9b3361

Ответ 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.

НТН! С Уважением, Ремко