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:

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s