Schlagwort-Archive: sql*net

sqlplus, ezconnect, ORA-12504 und kein Passwort

Aus der Kategorie „Heute dazugelernt“: Beim Versuch, mittels EZCONNECT (s. „Easy Connect Naming Method„) unter Verwendung eines Wallets eine Verbindung aufzubauen (um kein Passwort auf der Kommandozeile/im Script zu hinterlassen), wurde das stets mit einem „ORA-12504“ quittiert.

[oracle@myorabox bin]$ sqlplus scott@localhost/orcl

SQL*Plus: Release 11.2.0.3.0 Production on Mon Feb 24 16:19:14 2014

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

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

Seltsam — der Service „orcl“ ist doch angegeben?! Werfen wir mal einen Blick ins listener.log:

(CONNECT_DATA=(SERVICE_NAME=)(CID=(PROGRAM=sqlplus)(HOST=myorabox)(USER=oracle))) * establish * 12504

Tatsache — der „SERVICE_NAME“ ist leer.

Interessanterweise findet sich bei MOS nichts dazu, aber Mark Williams hat das Problem schon mal gelöst und netterweise gebloggt! Offenbar „verheddert“ sich SQL*Plus am fehlenden „/“ vor dem nicht übergebenen Passwort; Wird der Connect String jedoch in Anführungszeichen gesetzt, dann geht’s!

sqlplus scott@\"localhost/orcl\"

SQL*Plus: Release 11.2.0.3.0 Production on Mon Feb 24 16:31:38 2014

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

Enter password:

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

JDBC, Linux und reiner Zufall

Manche Probleme — besonders die, die nur sporadisch auftreten — sind nicht so leicht zu diagnostizieren und erfordern einen tieferen Einstieg in die Materie. In diesem Praxisbeispiel bedeutet das: SQL*Net Tracing und Verständnis für die Funktionsweise des Betriebssystems, speziell die Generierung von Zufallszahlen.

Der vorliegende Fall eignet sich daher sehr gut, um eine Vorgehensweise beim Troubleshooting von Verbindungen zur Datenbank exemplarisch darzulegen.

Weiterlesen

Unbekannt oder unterbewertet: IFILE-Direktive in tnsnames.ora

Man lernt ja bekanntlich nie aus… gestern habe ich jedenfalls gelernt, daß es auch in der „tnsnames.ora“ möglich ist, eine weitere Datei einzubinden, wie das auch in der init.ora möglich ist. Der magische Parameter hierfür lautet „IFILE=<Pfad>“. Mit diesem Praxistip will ich meine Artikelreihe „Unbekannt oder unterbewertet“ beginnen.

Weiterlesen

SQL*Plus unter Ubuntu (Instant Client)

Diese Beschreibung wurde mit dem Oracle Instant Client 11.2.0.1 x86-64 auf Ubuntu 10.04 „Lucid Lynx“ getestet.

Allgemeines

Seit der Version 9i liefert Oracle den Client — also die SQL*Net-Treiber — nicht mehr einzeln aus sondern nur noch im Bundle mit dem Oracle Server. Hat man die CDs gerade nicht zur Hand, muß man daher leider fast 1GB Daten herunterladen, um den Client installieren zu können.

Wer Produkte vertreibt, die auf Oracle aufsetzen und daher den Client benötigen, konnte bislang nicht einfach den Client mit vertreiben, da dies durch Oracles Lizenz nicht erlaubt war.

Beide Probleme löst der frei erhältliche „Instant Client“, der separat von anderer Oracle-Software (und damit z.B. ohne obligatorisches ORACLE_HOME) installiert werden kann. Dieser ist mit etwa 36MB (10g, 46 MB bei 11g) noch relativ schlank.

Installation

Wenn schon Oracle-Software installiert ist

  • Den Instant Client nicht in das gleiche Verzeichnis kopieren, in dem bereits die Binaries der anderen Oracle-Software liegen ($ORACLE_HOME)! Andernfalls zerschießt man sich damit die bestehende Installation.
  • In der Umgebungsvariablen PATH sollte — unabhängig von der Reihenfolge — entweder nur der Pfad zum Instant Client oder der Pfad zu den anderen Binaries stehen.

Installation unter Ubuntu

  1. Herunterladen des „Basic Clients“ von hier.
  2. Der Download muss zur Systemarchitektur passen (32/64 Bit, Prozessortyp)
    • Es ist jeweils die ZIP-Datei zu laden, da Ubuntu (wie auch Debian u.a.) nicht mit RPM-Paketen umgehen kann.
    • Ggf. kann auch der deutlich kleinere „Basic Lite“ Client eingesetzt werden, dieser unterstützt aber nur NLS_LANGUAGE=American mit den Zeichensätzen ASCII, WE8DEC und UTF.
  3. SQL*Plus kann ebenfalls unter obigem Link als Add-on heruntergeladen werden.
  4. Entpacken der Archive in ein eigenes Verzeichnis (z.B. „~/oracle/instantclient“ oder „/usr/lib/oracle/instantclient“).
  5. Einstellen des Suchpfades auf das neu erstellte Verzeichnis (zur Variablen LD_LIBRARY_PATH hinzufügen).
  6. Wenn eine tnsnames.ora genutzt werden soll: Einstellen der Umgebungsvariablen TNS_ADMIN=/pfad/zur/tnsnames.

Es gibt auch eine alternative, aber aufwendigere Installationsmöglichkeit, bei der der Instant Client in ein .deb-Paket konvertiert wird und sich damit später komfortabler deinstallieren lässt.

Für die Fans von Cut&Paste habe ich hier mal die Anweisungen am Beispiel meines Testsystems zusammengestellt (Auszuführen nach erfolgtem Download im Download-Verzeichnis). Er entpackt die Downloads, richtet einen symbolischen Link ein, damit SQL*Plus ohne Pfadangabe gestartet werden kann und trägt die Umgebungsvariable LD_LIBRARY_PATH fest für den momentanen Benutzer ein:

sudo unzip oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.zip -d /usr/lib/oracle/
sudo unzip oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.zip -d /usr/lib/oracle/
export LD_LIBRARY_PATH=/usr/lib/oracle/instantclient_11_2
sudo ln -s /usr/lib/oracle/instantclient_11_2/sqlplus /usr/bin/sqlplus
echo export LD_LIBRARY_PATH=/usr/lib/oracle/instantclient_11_2 >> ~/.bashrc

Verbindungsdeskriptoren

So kann man sich mit dem Instant Client zu einer Datenbank verbinden, wenn keine tnsnames.ora genutzt wird:

Variante 1:

sqlplus scott/tiger@//host:[port][/service name]

Variante 2:

sqlplus scott/tiger@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=meinserver)\
(Port = 1521)))(CONNECT_DATA=(SID=ORCL)))"

Weblinks

ORA-12508 Fehler mit Oracle8 / 8i

Diesen Artikel vom 18.11.2003 habe ich von meiner alten Homepage extrahiert, da immer noch Nachfrage nach dem Inhalt besteht und ich denke, daß der Artikel hier nun besser aufgehoben ist.

Worum geht es?

Auf einem System mit zwei parallel installierten Datenbankversionen (hier: 8.0.6 und 8.1.7) wächst das Logfile des 8.0.6-Listeners rapide. Der Großteil der Einträge im Logfile enthält Fehlermeldungen, die in kurzen Abständen (25s) wiederkehren.

Beschreibung des Problems

Dies ist eine besonders spannende (und seltene) Fehlermeldung, die laut Handbuch eigentlich „TNS-12508“ lauten sollte. Spannend vor allem, weil die lapidare Erläuterung des Fehlers folgendermaßen lautet:

ORA-12508: TNS:listener could not resolve the COMMAND given

    Cause: The COMMAND given to listener is not supported. Action: This is not seen in normal use of SQL*Net.*Comment: Check the COMMAND given to listener. This error is probably caused by incompatible SQL*Net versions. Do not include in error manual.

Besonders bemerkenswert finde ich den letzten Satz „Do not include in error manual“. :-)
In der Praxis ist mir dieser Fehler massenhaft in der Datei „listener.log“ begegnet, wobei auf dem betroffenen System zwei Oracle-Versionen, nämlich 8.0.6 und 8.1.7, installiert waren.

Ursache:

Ein detailliertes Trace-File des Listeners brachte es ans Licht: Der „nicht unterstützte Befehl“ an den Listener war ein SQL*Net-Befehl der Version 8i („service_register_NSGR“). Nach einigen Recherchen stellte sich heraus, daß dieser Befehl „von innen“ kommen musste, also nicht von einem Client-PC. Oracle Note 103143.1, die allerdings nirgendwo mehr in den Oracle-Systemen auffindbar ist, weist auf Probleme zwischen den Listenern von parallel installierten Versionen hin, speziell der Version 8.0.x gegenüber höheren Versionen.

  ...
  nsprecv: packet dump
  nsprecv:00 68 00 00 01 00 00 00  |.h......|
  nsprecv:01 36 01 2C 00 00 20 00  |.6.,.. .|
  nsprecv:7F FF 7F 08 00 00 00 01  |........|
  nsprecv:00 2E 00 3A 00 00 00 00  |...:....|
  nsprecv:41 41 00 00 00 00 00 00  |AA......|
  nsprecv:00 00 00 00 6B 5C 3C 46  |....k\<F|
  nsprecv:19 97 00 00 00 00 00 00  |........|
  nsprecv:00 00 28 43 4F 4E 4E 45  |..(CONNE|
  nsprecv:43 54 5F 44 41 54 41 3D  |CT_DATA=|
  nsprecv:28 43 4F 4D 4D 41 4E 44  |(COMMAND|
  nsprecv:3D 73 65 72 76 69 63 65  |=service|
  nsprecv:5F 72 65 67 69 73 74 65  |_registe|
  nsprecv:72 5F 4E 53 47 52 29 29  |r_NSGR))|
  nsprecv: normal exit
  ...

Genau genommen dürfte das Problem auf allen Systemen auftreten, auf denen ein Listener einer Version unter 8.1.6 auf Port 1521 und eine Instanz ab Version 8.1.6 installiert sind. In diesem Fall versucht der PMON der Instanz, diese mit einem Listener auf Port 1521 automatisch zu registrieren, wobei der Befehl „service_register_NSGR“ benutzt wird.

Lösung des Problems

Es hat sich als praktikabel erwiesen, den Listener der Version 8, der noch auf Port 1521 eingestellt war, auf Port 1528 umzustellen. Natürlich sind auch andere Ports einstellbar, lediglich mit Port 1521 sind die Fehler überhaupt aufgetaucht.

Alternativ kann für die Instanzen der höheren Version auch der init.ora Parameter „LOCAL_LISTENER“ gesetzt werden:

  LOCAL_LISTENER=listener_A

Dies führt dazu, daß PMON nur noch den dort angegebenen Listener benutzt. Allerdings sollte dieser dann auch in der Datei „tnsnames.ora“ eingetragen sein:

  listener_A =
    (DESCRIPTION =
      (ADDRESS=(PROTOCOL=TCP)(HOST=uksn155)(PORT=2500))
    )

Weiterführende Links:

TNS-00512 Fehler mit Oracle8 unter Windows NT/2000

Diesen Artikel vom 10.1.2002 habe ich von meiner alten Homepage extrahiert, da immer noch Nachfrage nach dem Inhalt besteht und ich denke, daß der Artikel hier nun besser aufgehoben ist.

Worum geht es?

Bei der Installation von Oracle8 unter Windows NT (SP3) oder 2000 (SP2) werden Datenbanken nicht richtig installiert.
Dies passiert sowohl bei der Installation der Default-Datenbank von der CD als auch beim Aufsetzen einer neuen Datenbank mithilfe des „Oracle Database Assistant“.

Beschreibung des Problems

Bei der Installation der mitgelieferten Datenbank bleibt der Installer an der Stelle „running Scripts…“ hängen. In der Task-Leiste findet sich ein MS-DOS Fenster, in dem der svrmgr mit der Fehlermeldung „TNS: Unable to connect to destination“ hängen geblieben ist.

Der Hintergrund ist jedoch ein ganz anderer:
Versucht man, beispielsweise mit dem Oracle Database Assistant, eine neue Datenbank aufzusetzen, so gelingt dies auch zunächst. Eine Verbindung mit der Datenbank ist jedoch noch nicht möglich, weil noch kein Listener hochgefahren ist („TNS: no listener“).
Wenn man nun im DOS-Fenster den Listener-Dienst starten möchte („lsnrctl80 start„), so erhält man folgende Fehlermeldung:

  TNS-12542: TNS:address already in use
    TNS-12560: TNS:protocol adapter error
      TNS-00512: Address already in use
        32-bit Windows Error: 48: Unknown system error

Das heißt: Obwohl man bisher noch keine eigenhändige Veränderung an den Listener-Einstellungen gemacht hat, gibt es schon Fehler beim Starten des Listeners!

Lösung des Problems

Die Meldung „TNS:address already in use“ deutet an, daß bereits ein Listener auf derselben Adresse (bzw. demselben Port) lauscht, auf dem nun noch ein weiterer Listener gestartet werden soll.

Ein kurzer Blick in die Datei „listener.ora“ zeigt folgende Einträge:

        (ADDRESS=(PROTOCOL= TCP)(Host= meinhost)(Port= 1521)  )
  und
        (ADDRESS=(PROTOCOL= TCP)(Host= 127.0.0.1)(Port= 1521)  )

Hier liegt die Ursache: Der Installer hat sowohl den Hostnamen als auch die lokale Netzwerkadresse in die Datei eingetragen. Die Entfernung von einem dieser beiden Einträge (Empfehlung: den Eintrag mit „127.0.0.1“ entfernen) sorgt für Abhilfe.
Nach dem Entfernen dieses Eintrages muß der Listener neu gestartet werden. Dies kann wahlweise durch den Windows-Dienstemanager oder auf der Kommandozeile mit „lsnrctl80 reload“ erfolgen.