Schlagwort-Archive: listener

JDBC, Linux und reiner Zufall

Read this article in English →

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

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.