2015-04-15 7 views
12

Pobrałem SQLPLUS z Oracle:błąd SQLPLUS: ORA-12504: TNS: słuchacz nie dano SERVICE_NAME w CONNECT_DATA

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

Podstawowe Lite i SQL * Plus

I potem wystrzelił w górę 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. 

i próbował połączyć się z bazą danych:

connect user\[email protected] 

i otrzymał komunikat o błędzie:

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

Czego mi brakuje?

Pobiegłem zapytania sugerowane przez Jakub, mam

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> 
+0

Czy masz wpisy tns wpisane w pliku tnsnames.Ora? – anudeepks

+0

Nie mam pliku tsnames.ora. Próbuję połączyć się przy użyciu adresu IP (powinno to wspomnieć, przepraszam!) – gbritton

+0

Czy baza danych znajduje się w twoim komputerze (Windows) lub na serwerze? (prawdopodobnie linux, aix ....)? – anudeepks

Odpowiedz

9

Brakuje nazwę usługi:

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

EDIT

Jeśli można połączyć się z bazą danych inny komputer spróbuj tam uruchomić:

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

i

select sys_context('USERENV','SID') from dual 
+0

OK! Teraz, w jaki sposób mogę odkryć nazwę usługi serv dla serwera Oracle na podanym adresie IP? – gbritton

+0

Sprawdź plik listener.ora na serwerze bazy danych. http://docs.oracle.com/cd/E11882_01/network.112/e10835/listener.htm#NETRF008 –

+0

Nie mam uprawnień do logowania się na serwerze, tylko identyfikator użytkownika, który może odczytać niektóre tabele, których potrzebuję. Mam jednak dostęp do serwera, który może logować się przy użyciu aliasu. więc połącz user \ pass @ alias działa poprawnie. Domyślam się, że nie ma sposobu, aby odkryć nazwę usługi za pomocą otwartego połączenia. Teraz zastanawiam się, czy wystarczy skopiować tsnames.ora, listener.ora. pliki sqlnet.ora na mój komputer. Gdybym to zrobił, gdzie by je umieścić? – gbritton

0

Wystarczy mała obserwacja: zachować wspomnieć Conn usr \ mijają, a to jest literówka, prawda? Ponieważ powinien to być conn usr/pass. Czy jest inny w systemie operacyjnym Unix?

Ponadto, dla pewności: jeśli używasz tnsnames, twój ciąg logowania będzie wyglądał inaczej niż w przypadku użycia metody logowania, z którą rozpocząłeś ten temat.

Serwer tnsnames.ora powinien znajdować się w katalogu $ ORACLE_HOME $ \ network \ admin. To jest dom Oracle na komputerze, z którego próbujesz się połączyć, więc w twoim przypadku twój komputer. Jeśli masz wiele obiektów Oracle i chcesz używać tylko jednej tnsnames.ora, możesz ustawić zmienną środowiskową tns_admin (np. Ustawić TNS_ADMIN = c: \ oracle \ tns) i umieścić tnsnames.ora w tym katalogu.

Twoja oryginalna metoda logowania (usr/[email protected]: port/nazwa usługi) powinna zawsze działać. Do tej pory myślę, że masz wszystkie informacje, z wyjątkiem numeru portu, który jestem pewien, że twój DBA będzie mógł ci dać. Jeśli ta metoda nadal nie działa, adres IP serwera nie jest dostępny od klienta lub jest to problem z zaporą (blokowanie określonego portu) lub coś innego, co nie (bezpośrednio) związane z Oracle lub SQL * Plus.

hth! Pozdrowienia, Remco

+0

Nie mam oracle zainstalowane na moim komputerze. Mam tylko plik wykonywalny sqlplus. Nic więcej. OTOH Wierzę, że na przeszkodzie może być zapora sieciowa. – gbritton

7

Wpadłem na ten sam problem w identycznych okolicznościach. Nie mam pliku tnsnames.ora i chciałem użyć formatu SQL * Plus z łatwym do identyfikacji identyfikatora w linii poleceń. Rozwiązałem ten problem w następujący sposób.

The SQL*Plus® User's Guide and Reference podaje przykład:

sqlplus [email protected]\"sales-server:1521/sales.us.acme.com\"

zwrócić uwagę na dwa ważne punkty:

  1. Identyfikator połączenia jest cytowany. Masz dwie opcje:
    1. Możesz użyć polecenia SQL * Plus CONNECT i po prostu przekazać cytowany ciąg znaków.
    2. Jeśli chcesz określić parametry połączenia w wierszu poleceń, musisz dodać ukośniki odwrotne jako tarcze przed cudzysłowami. Nakazuje bashowi przekazywanie cytatów do SQL * Plus.
  2. Nazwa usługi musi być określona w formularzu FQDN zgodnie z konfiguracją DBA.

Znalazłem te dobre pytania, aby wykryć nazwę usługi poprzez istniejące połączenie: 1, 2. Wypróbuj to zapytanie, na przykład:

SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES' 
Powiązane problemy