Wo setzt man TNS_ADMIN für die Datenbank?
Von Zeit zu Zeit entsteht der Bedarf, Anpassungen an der SQLNET.ORA für eine Datenbank vorzunehmen um z.B. die Netzwerkverschlüsselung einzuschalten oder um Clients, die eine ältere Oracle Version einsetzen, zuzulassen. Die Datenbank liest die Einstellungenstandardmäßig aus dem Verzeichnis network/admin unterhalb des Oracle Homes. Wird das Oracle Home von mehreren Datenbanken verwendet, kann man auch die Umgebungsvariable TNS_ADMIN verwenden, um den Pfad zru gewünschten SQLNET.ORA explizit anzugeben. An dieser Stelle wird es auch spannend, denn die Datenbankprozesse erben die Umgebungsvariablen immer vom aufrufenden Prozess. Das können sein:
- die interaktive Shell
- die Grid Infrastructure bzw. Restart
- der Listener
Man muss also für alle Varianten dafür sorgen, dass die Variable TNS_ADMIN wie gewünscht gesetzt ist. Für die interaktive Shell ist das einfach:
export TNS_ADMIN=/home/oracle/network/admin
Die Grid Infrastructure weiß davon natürlich nichts. Hier muss die Variable per "srvctl" für die Datenbank-Ressource definiert werden:
[oracle@vm123 ~]$ srvctl setenv database -d orcl112b -T "TNS_ADMIN=/home/oracle/network/admin"
[oracle@vm123 ~]$ srvctl getenv database -d orcl112b
orcl112b:
ARCLOG_DEL_MODE=PRIMARY
ARCHIVELOG_DELETION_MODE=PRIMARY
TNS_ADMIN=/home/oracle/network/admin
Auch für den Listener müssen separate Einstellungen vorgenommen werden. Das ist dann erforderlich, wenn die Datenbank über das Netzwerk gestoppt und gestartet werden soll. Notwendig ist das unter anderem bei Duplicate-Operationen per RMAN oder beim Data Guard Switchover, wenn keine Grid Infrastructure installiert ist. Vorgenommen wird die Einstellung für die Umgebungsvariablen in der SID_LIST in der Datei LISTENER.ORA:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl112b)
(ORACLE_HOME = /u01/app/oracle/product/db/11.2.0.4)
(SID_NAME = orcl112)
(ENVS = "TNS_ADMIN=/home/oracle/network/admin")
)
)
Damit setzt auch der Listener den korrekten Wert für TNS_ADMIN, wenn die Datenbank über diesen Weg gestartet wird.
Egal, wie die Einstellungen sind, die Datenbank wird im Normafall immer fehlerfrei starten. Aber je nach dem wie die Umgebungsvariablen gesetzt sind, wird unter Umständen eine falsche SQLNET.ORA Datei verwendet. Das wiederum kann dazu führen, das z.B. die gewollte Netzwerkverschlüsselung doch nicht aktiv ist.
Unter Linux lassen sich die tatsächlich verwendeten Umgebungsvariablen aus /proc auslesen und mit etwas Scripting gut darstellen:
[oracle@vm121 ~]$ ps -ef|grep smon|grep -v grep
oracle 4294 1 0 12:27 ? 00:00:00 ora_smon_orcl112
[oracle@vm121 ~]$ cat /proc/4294/environ | sed 's/\o0/NEWLINE/g' | awk -F 'NEWLINE' '{$1=$1}1' OFS='\n' |grep TNS
TNS_ADMIN=/home/oracle/network/admin
Kommentare
Keine Kommentare