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.

Praxisszenario

In vielen Unternehmen wird die tnsnames.ora zentral gepflegt. Auf die einzelnen Clients wird diese Datei dann bei Bedarf/Änderungen über das Netzwerk verteilt.

Das bringt allerdings Probleme mit sich: Gerade in Entwicklungs- und Testumgebungen werden schnell mal ein paar Datenbanken erstellt, wieder gelöscht oder umgezogen. Der Zeitraum bis zum erneuten Roll-out der tnsnames.ora ist dabei oft inakzeptabel (aus eigener Erfahrung spreche ich da über Wochen, nicht Tage). Also passen die Benutzer ihre tnsnames.ora selbst an.

Das geht dann so lange gut, bis die paketierte tnsnames.ora erneut ausgerollt wird und dabei alle persönlichen Änderungen überschreibt. Kurz darauf klingelt dann das Telefon bei den DBAs Sturm… ;-)

Wie könnte man dieses Problem elegant lösen?

  • Verwendung des „Oracle Internet Directory (OID)“, einem LDAP-Server, vergleichbar dem DNS im Internet, nur eben für TNS-Einträge. Das verursacht aber Kosten für Lizenzierung, Wartung, Pflege und Hardware. Außerdem sollte so ein Server hochverfügbar gehalten werden, sonst ist er ein „Single Point Of Failure“. Das kostet noch mehr.
  • Vorhalten einer eigenen Datei (eventuell auch spezifisch für ein Projektteam), die nach einem zentralen Roll-out einfach wieder darüber kopiert wird. Das ist nachvollziehbar unhandlich,  umständlich und fehleranfällig.
  • Schöner wäre es doch, eine eigene Datei als Ergänzung zur zentral administrierten zu haben. So, wie es bei vielen Systemen und Programmiersprachen mit „include“ oder „includefile“ funktioniert. Und – siehe da – das geht, obwohl es so nicht in der Oracle Net Doku zu finden ist!

TNS_ADMIN und IFILE kombinieren

Für das o.g. Szenario bietet sich ein weiterer Parameter für SQL*Net an, nämlich die Umgebungsvariable „TNS_ADMIN“. Diese wird auf der Kommandozeile oder (unter Windows) in der Registry gesetzt und zeigt auf den Dateipfad, unter dem der Oracle Client nach tnsnames.ora, sqlnet.ora etc. suchen soll (anstelle von „ORACLE_HOME/network/admin“).

Diese Umgebungsvariable setzen wir nun so, daß sie auf ein persönliches Verzeichnis oder auch ein projektspezifisches Verzeichnis zeigt. Dort liegt unsere eigene tnsnames.ora, die dann mit dem IFILE-Parameter die zentrale tnsnames.ora inkludiert. Das könnte folgendermaßen aussehen:

Auf der Kommandozeile:


export TNS_ADMIN=/home/oraculix/tns

Eigene Datei „/home/oraculix/tns/tnsnames.ora“:

# Haupt-Datei einbinden:
IFILE=$ORACLE_HOME/network/admin/tnsnames.ora
# Meine eigenen Eintraege:
MYORCL =
  (DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(Host = dk-kirke)(Port = 5211)))
    (CONNECT_DATA = (SID = T_ECU_I1)))

Voilá! Nun werden unsere eigenen Einstellungen nicht ständig überschrieben, und wir können dennoch von einer zentral administrierten Datei profitieren.

Fallstricke

  1. Dieser Parameter ist undokumentiert. Auch wenn er schon mindestens seit Oracle 7 genutzt werden kann, heißt das nicht, daß er nicht irgendwann einfach verschwindet. Bis 11gR2 läuft er jedoch, und da auch die Oracle E-Business Suite diesen Parameter nutzt, wird er wohl so schnell nicht abgeschaltet.
  2. Auf die Präzedenz achten: Wenn ein TNS-Eintrag mehrfach vorkommt, dann wird der letzte Eintrag ausgewertet (eigener Erfahrungswert, nicht durch Oracle-Doku bestätigt).
  3. In der SQL Developer FAQ wird erwähnt, daß es zu einer leeren Liste von TNS-Namen führen kann, wenn Leerzeichen in der „IFILE=“-Zeile stehen. Also einfach keine Leerzeichen vor und nach dem „=“ einfügen.
  4. Entgegen der Dokumentation für die init.ora kann IFILE in der tnsnames.ora nicht verschachtelt werden.

Weblinks

Nachträge

Nachtrag vom 19.1.2011: Oracle hat mir bestätigt, daß der IFILE-Parameter auch in der tnsnames.ora und listener.ora offiziell unterstützt ist. Dies unter Verweis auf Dokument 91990.1, das aber dummerweise nicht öffentlich einsehbar ist. Zitat:

„The same principle could be applied to the tnsnames.ora and listener.orafiles. The common tnsnames.ora file would contain normal connection strings. The individual tnsnames.ora file would most likely contain only one line:

IFILE = J:\ORACLE\NETWORK\ADMIN\TNSNAMES.ORA

Other connect strings specific to this one client could be included in the specific tnsnames.ora after the IFILE statement.“

Nachtrag vom 21.1.2011: Oracle Support hat meine Anfrage in einen Documentation Bug (#11661650) umgewandelt.

Nachtrag vom 26.1.2011: Oracle Support hat den Bug geschlossen; Begründung (übersetzt):

Es gibt bessere Methoden, diese Funktionalität zu erreichen. Z.B. kann der User EasyConnect oder LDAP benutzen.

Okay, LDAP ist verständlich und oben auch schon dargestellt. Aber EasyConnect? Die Empfehlung ist in etwa so wie einem Browser-Anwender zu sagen: „Du brauchst keine Domainnamen, Du kannst doch auch die IP-Adressen eingeben!“.

Nachtrag vom 14.12.2012: TOAD 11.6.1 unterstützt nun auch IFILE. Und zwar auch im tnsnames-Editor. Das ist begrüßenswert, denn je mehr das Feature wieder bekannt und benutzt wird, desto unwahrscheinlicher wird es, daß Oracle das irgendwann einmal ausbauen könnte.

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