# [Oracle] Woher weiss SQL*PLUS wo die Datenbank sich befindet?



## oraclin25 (30. April 2012)

Hallo zusammen,

eine ganz schlichte Frage.  in welchem Skript werden die Pfade zwischen SQL*PLUS und Datenbank-Dateien gespeichert, so dass SQL*PLUS direkt weiss, wo er zuzugreifen hat?
Danke.

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## Michael Melchers (30. April 2012)

Hallo Ratna,

SQL*Plus greift nicht auf ein Skript zu, sondern nutzt die gesetzten Umgebungsvariablen, um sich mit der entsprechenden Datenbank zu verbinden.

Zwei Beispiele:
1.
Wenn du nur eine Datenbank auf dem Datenbank-Server betreibst, so wird als Umgebungsvariable ORACLE_SID der Name der erstellten Datenbank mit angegeben:

set ORACLE_SID=testdb

2.
Sind zwei oder mehr Datenbanken auf dem Server vorhanden, so muss unter Windows jedesmal bevor SQL*Plus aufgerufen wird, die Umgebungsvariable für die jetzt "anzusprechende" Datenbank gesetzt werden:

set ORACLE_SID=testdb

Möchtest du dich hinterher mit einer anderen Datenbank verbinden, so beendest du die SQL*Plus-Sitzung und setzt die Umgebunsvariable ORACLE_SID wieder neu:

set ORACLE_SID=proddb

Bei mehreren DB auf einem Server sind ORACLE_BASE und ORACLE_HOME gleich. Um diese Variablen muss man sich nicht kümmern. Entscheidend für die Verbindung zur gewünschten Datenbank mit SQL*Plus ist die ORACLE_SID.

Anhand der ORACLE_SID wird dann systemintern beim Aufruf von SQL*Plus die passende Initialisierungsdatei (init_<SID>.ora oder spfile<SID>.ora) aufgerufen. In diesen Dateien stehen auch die Pfade zu den entsprechend passenden Datenbank-Dateien.

Ich hoffe, damit geholfen zu haben!

Gruß,
Michael


----------



## oraclin25 (30. April 2012)

Hallo Michael,

vielen lieben Dank.  Ich habe versucht, in SQL*PLUS eine Umgebungsvariable zu setzen:
set ORACLE_SID = XE

Leider gibt er mir einen Fehler aus:
Unbekannte option SET ab "ORACLE_SID..."

Ich bin mir sicher, dass ORACLE_SID mit dem Wert XE belegt ist.  Dies steht im Registrierungseditor.

Liegt es vielleicht an der Expressedition?  In einer anderen Version müsste dies funktionieren, oder?

Schöne Grüße aus Rheinland,
Eure Ratna


Ich nehme an, es liegt an der XE-Version


----------



## Michael Melchers (30. April 2012)

Hallo Ratna,

hast du nun versucht die Umgebungsvariable in SQL*Plus zu setzen, oder meintest du die Eingabeaufforderung von Windows?

In SQL*Plus kann man keine Umgebungsvariable setzen...

Gruß,
Michael

PS: kannst du denn mit SQL*Plus eine Verbindung zur Datenbank herstellen?


----------



## oraclin25 (30. April 2012)

Hallo Michael,

stimmt, ich habe mich vertan.. statt auf der Eingabeaufforderung, habe ich im SQL*Plus den Befehl ausgeführt.  

Mich verwirrt:
1. was macht eigentlich genau "set ORACLE_SID = XE"  ?
Also, das Wort "Setzen" ist waage.  set = in die Umgebung wechseln?  set = eine Umgebung in die Variable ORACLE_SID identifizieren?

Wenn ich auf der EINGABEAUFFORDERUNG folgendes ausführe, passiert nichts:
C:>set ORACLE_SID = XE
C:>

Soll das auch so sein?

...Sind zwei oder mehr Datenbanken auf dem Server vorhanden, so muss unter Windows jedesmal bevor SQL*Plus aufgerufen wird, die Umgebungsvariable für die jetzt "anzusprechende" Datenbank gesetzt werden:

set ORACLE_SID=testdb

D.h. erst den Befehl "set ORACLE_SID=XE" in der Eingabeaufforderung ausführen, bevor ebenfalls in der Eingabeaufforderung den Befehl "sqlplus" ausführen?

Danke



Nebenbei gemerkt, ich kann auf SQL*PLUS eine Verbindung zur Datenbank herstellen.


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

also mit "set ORACLE_SID=XE" setzt du eine Umgebungsvariable. Mit Hilfe von Umgebungsvariablen wie ORACLE_HOME, ORACLE_SID usw. steuerst du intern das Kommandozeilentool SQL*Plus. SQL*Plus muss ja wissen, mit welcher "Umgebung" er sich verbinden soll (bei mehr als einer DB auf dem Server).

Was du beim Setzen einer Umgebungsvariable beachten musst: es dürfen keine Leerzeichen vorhanden sein. Der Befehl "set ORACLE_SID = XE" wird zwar fehlerfrei vom Betriebssystem angenommen, aber ein "echo %ORACLE_SID% gibt nur %ORACLE_SID% als Wert aus - und das ist nicht richtig.

Es muss also heissen: set ORACLE_SID=XE

Nachdem der Befehl eingeben und mit ENTER bestätigt wurde, erscheint auch wieder nur der DOS-Prompt C:\

Mit "echo %ORACLE_SID%" wird jetzt auch der Inhalt der Umgebungsvariablen angezeigt (hier: XE).
Dann in der Eingabeaufforderung "sqlplus" oder "sqlplus / as sysdba" eingeben und du landest im SQL*Plus-Prompt.

Da du aber Oracle Express Edition installiert hast, hast du nur eine Datenbank. Dafür musst du keine ORACLE_SID setzen. Solltest du jetzt eine falsche ORACLE_SID angeben (z. B. XETEST), dann kannst du dich mit "sqlplus / as sysdba" nicht mit der Datenbank verbinden. Es kommt dann zu einem TNS Protocol adapter error. (Mit set ORACLE_SID= kannst du den Wert der Variablen wieder löschen)

Übrigens kannst du mit dem folgenden SQL-Statement prüfen, wie die Datenbank heisst (dieser Wert ist die ORACLE_SID):
SQL> select instance from v$thread;
oder
SQL> select instance_name from v$instance;

Viele Grüße,
Michael


----------



## oraclin25 (1. Mai 2012)

Hallo Michael,

super erklärt, dabei hast Du ja eigentlich dein Oracle unter Linux laufen. vielen lieben Dank..  Wenn ich so überlege , ich war eigentlich auf dem richtigen Gedankenweg, nur,  ich wäre nicht draufgekommen, dass die Umgebungsvariable lediglich über Windows-Eingabeaufforderung zu setzen ist.  Ich dachte nämlich, dies wäre zu erfolgen, wenn man sich bereits im SQL*PLUS-Prompt befindet.  So, jetzt gehts an den Versuch, einen Client auf einem Zweitrechner zu installieren und von da aus eine Verbindung zum Server herzustellen.  Drück mir die Daumen..

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## Thomas Darimont (1. Mai 2012)

Hallo,

zusätzlich zu der umfangreichen Erklärung von Michael Melchers wollte ich nur noch erwähnen, dass man sich über:

```
sqlplus "connectstring"
```

Z.Bsp:

```
REM mit User "username" und Passwort "password" zur lokalen Instanz "InstanceName" verbinden (bzw. der Instanz die mit "InstanceName" in der tnsnames.ora beschrieben ist)
sqlplus username/password@InstanceName
```
...auch explizit mit einer lokalen oder auch remote Instanz verbinden kann.
Siehe auch:
http://mattejones.wordpress.com/2011/06/22/sqlplus-connection-string-options/
http://penguinman-techtalk.blogspot.de/2009/02/sqlplus-connection-to-remote-oracle.html

Gruß Tom


----------



## oraclin25 (1. Mai 2012)

Hallo Tom,

mhh.. Du meinst, es reicht, auf dem Zweitrechner, "lediglich" SQL*PLUS zu installieren?  Mhh.. aber wie würde dann die Verbindungskonfiguration aussehen?  Informationen bzgl. Hostnamen, Server-Port, Instanzname?

Danke..

Schöne Grüße aus Rheinland,

Eure Ratna


----------



## Thomas Darimont (1. Mai 2012)

Hallo,



> mhh.. Du meinst, es reicht, auf dem Zweitrechner, "lediglich" SQL*PLUS zu installieren?


Nicht ganz... du brauchst zumindest eine Oracle Client Installation (eine Installations Variante im Installer), In der Oracle Client Installation dort ist dann u.a. auch SQL Plus enthalten. 



> Mhh.. aber wie würde dann die Verbindungskonfiguration aussehen? Informationen bzgl. Hostnamen, Server-Port, Instanzname?



Du kannst dich dann, wie in den obigen Links angegeben, per SQL Plus auch mit einer entfernten Datenbank-Instanz verbinden.

Gruß Tom


----------



## oraclin25 (1. Mai 2012)

Hallo Tom,

ach so, danke..  Mhh.. eine Frage zwischendurch:

$ sqlplus dbUser/dbPassword@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=remoteServer)(PORT=1521)))(CONNECT_DATA=(SID=dbSid)))'

Das wäre ein Beispiel, wie man eine remote-Verbindung zur Datenbank herstellt.  Ich frage mich:
Angenommen, ich habe auf Rechner_1 eine Datenbank mit dem Namen "finance".  Weiterhin auf Rechner_1 existieren 2 Instanzen, die "finance" bedienen, sagen wir mal Ins_1 und Ins_2.

Anhand obigen Beispiels der string-Verbindung würde es ja heißen, dass der CLIENT auf Rechner_2 die Möglichkeit hat, zu wählen, mit welcher Instanz der CLIENT sich mit "finance" verbinden möchte.  Also:
HOST=finance
...
SID=Ins_1
...

Ist das richtig so?
Danke

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## oraclin25 (1. Mai 2012)

Mhh.. ich bin mal ein bisschen kleinig:
set ORACLE_SID=Ins_1

ist das eigentlich eine Aktion zum Setzen der Umgebungsvariable oder eher eine Aktion, mit welcher Instanz man mit der Datenbank arbeiten möchte?

Ich habe ja lediglich eine Datenbank und eine Instanz.  Damit kann ich mich direkt anmelden ohne erstmal set ORACLE_SID=XE ausführen zu müssen.  Als wäre die "Umgebung" bereits "gesetzt".  Ich glaube, dass der Ausdruck "Umgebungsvariable setzen" nicht richitg ist.  Danke

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

primär ist "set ORACLE_SID=Ins_1" eine Aktion, um eine Umgebungsvariable zu setzen. Wenn diese aber auch gesetzt wurde, dann verbindest du dich mit dieser Datenbank, wenn du SQL*Plus startest. Allerdings kannst du die ORACLE_SID "umgehen", wenn du den von Tom erwähnten Connectstring verwendest (konfigurierte listener.ora-Datei vorausgesetzt).

Eine Oracle-DB-Installation unter Linux liefert ein kleines Shell-Script mit, mit dem man bequem die ORACLE_SID festlegen bzw. zwischen mehreren wechseln kann (Scriptname: oraenv). Unter Windows fehlt dieses Script aber. Da bleibt halt nur die oben beschriebene Variante.

Bei der Installation von Oracle Express Edition wird die ORACLE_SID in die Registry geschrieben (unter: HKEY_LOCAL_MACHINE\Software\Oracle\KEY_XE\). Somit ist "die Umgebung bereits gesetzt".

Du kannst testweise den Wert der SID in der Registry mal ändern und versuchen, dich mittels "sqlplus / as sysdba" zu verbinden - es kommt zu einer Fehlermeldung.

Setzt du dann manuell in der Eingabeaufforderung die ORACLE_SID=XE, dann ist eine Verbindung wieder möglich oder du gibst den Connectstring mit an.

Gruß,
Michael


----------



## oraclin25 (1. Mai 2012)

Hallo Michael,

danke..

$ sqlplus dbUser/dbPassword@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=remoteServer)(PORT=1521)))(CONNECT_DATA=(SID=dbSid)))'

aus dem String ziehe ich unter anderem folgende Verbindungsinformationen raus:
1. den Hostnamen vom Datenbank-Server
2. die Portnummer des Listeners
3. die Instanz(ORACLE_SID)

Was ist eigentlich mit den anderen Informationen wie z.B. ORACLE_BASE oder ORACLE_HOME von dem Server?  Sie braucht der Client oder?  Sind sie irgendwo intern im System von dem Client installiert?  Kann nicht sein oder?

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

die Informationen, die du aus dem Connection-String erhälst, sind korrekt.

Die Infos wie ORACLE_BASE und ORACLE_HOME auf dem Server werden von den Clients nicht benötigt. Das sind Informationen der Oracle-Installation des Servers.

Der Client benötigt für eine SQL*Plus-Session den Connectionstring oder den Service-Name (z. B. XE). Denk dran, dass du auf dem Client die Datei tnsnames.ora mit dem Eintrag aus der tnsnames.ora des Servers (auf dem die XE läuft) versiehst. Und auf dem Server muss der Listener gestartet sein. Kann getestet werden mit: lsnrctl status XE in der Eingabeaufforderung.

Du kommst jetzt in den Bereich der SQLnet-Konfiguration von Oracle. Kann manchmal etwas "tricky" sein...

Viele Grüße,
Michael


----------



## oraclin25 (1. Mai 2012)

Hallo Michael,

danke danke... mhh.. eine Frage: Service-Name und ORACLE_SID sind das Gleiche?

Schöne Grüße,
Eure Ratna


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

sie können zwar den gleichen Namen haben, sind aber dennoch unterschiedlich zu verstehen.

Die SID ist ein eindeutiger Bezeichner/Name für eine Oracle Instanz. Der Service-Name ist einfach ausgedrückt der Alias in der tnsnames.ora, der für Remote-Verbindungen vergeben wird.

In deiner tnsnames.ora könnte folgendes drinstehen:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <SERVERNAME oder IP>)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Viele Grüße,
Michael


----------



## oraclin25 (1. Mai 2012)

Hallo Michael, 

danke..  

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = Heim)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Hier fällt mir etwas auf.  Als HOST ist hier "Heim" eingetragen.  Was ist der Unterschied zwischen "Heim" und "localhost"?  Weisst Du das vielleicht?

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## oraclin25 (1. Mai 2012)

ich kann mir nicht vorstellen, dass bei "HOST" ich "Heim" einzugeben habe.  Eher meine IP-Adresse oder?


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

ich tippe mal drauf, dass in der Hosts-Datei als Alias für die IP 127.0.0.1 "Heim" drin steht. Sicher bin ich mir da aber nicht...

Viele Grüße,
Michael


----------



## oraclin25 (1. Mai 2012)

Richtig..

in der Hostdatei existiert so eine Zeile:

127.0.0.1       localhost

Aber trotzdem bin ich noch etwas stützig, denn erstens das ist nicht meine IP-Adresse.  Zweitens, wo auf der Client-Seite steht beim Verbinden von Client(Rechner 2) mit dem Oracle-Server(Rechner 1) die Angabe über die IP-Adresse vom Rechner 1?

Ich habe geschaut:  
In dem Verbindungsstring ist nirgendswo, wo ich die IP-Adresse des Oracle-Servers(Rechner 1) eingeben kann:

$ sqlplus dbUser/dbPassword@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=remoteServer)(PORT=1521)))(CONNE CT_DATA=(SID=dbSid)))'

Vielleicht in der Datei tnsnames.ora von der Client-Seite?

Och je, ich hoffe Du verstehst was ich meine. 

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## Michael Melchers (1. Mai 2012)

Hallo Ratna,

die 127.0.0.1 ist die IP für den localhost.

Gib mal im Verbindungsstring hinter HOST statt eines Hostnamen die IP-Adresse des DB-Servers ein.

Statt Hostname ist nämlich auch die IP möglich.

Wenn du Connectionstrings nutzt, brauchst du die tnsnames.ora auf der Client-Seite nicht. Best Practice ist es aber, eine tnsnames.ora zu konfigurieren. Auch dort kann statt Hostname die IP verwendet werden.

Viele Grüße,
Michael


----------



## oraclin25 (1. Mai 2012)

Okay, ich probiere es mal.  Danke Dir..

Guten Abend,
Eure Ratna


----------



## Michael Melchers (1. Mai 2012)

Viel Erfolg!

Gruß,
Michael


----------



## oraclin25 (1. Mai 2012)

mhh.. komisch, hab einen Blick in Documentation reingeworfen:

To connect remotely, you must supply not just a user name and password, but a complete Oracle Net connect string. In addition to the database user name and password, a connect string includes a host name or host IP address, an optional TCP port number, and an optional database service name. These additional parameters are required to help Oracle Net find the right host computer and connect to Oracle Database XE. An Oracle Net connect string has the following format:

username/password@[//]host[ort][/service_name]

where:

•// is optional

•host is the host name or IP address of the computer that is running Oracle Database XE


Also, hier steht, dass fürs Feld host der Hostname(Heim) ODER IP-Adresse stehen darf.  Also, Millionen von Leuten können denselben Hostnamen(Heim) besitzen.  Wie soll der Client den Server finden?  

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## sheel (2. Mai 2012)

Hi

das ganze Netzwerkzeug ist etwas komplex, deshalb nur kurz:
Die Hostnamen werden nicht über das Internet ausgetauscht.

Unter der Voraussetzung, dass dein "Netzwerk" daheim
aus 1 Router für den Internetzugang besteht:
Die Computer, die an dem Router angeschlossen sind, sollten nicht gleiche Namen haben.
Andere, weiter weg, werden ignoriert.

Um sicher zu gehen kann man ja, wie schon gesagt wurde, die IP 127.0.0.1 verwenden.
Die steht immer für den Computer, an dem sie verwendet wird.


----------



## oraclin25 (2. Mai 2012)

Hallo shell,

danke für den Beitrag.  Es geht hier mehr darum, was zur Verbindung mit einem remote-Server im Feld HOST einzugeben ist.  Laut Dokumentation von Oracle:

To connect remotely, you must supply not just a user name and password, but a complete Oracle Net connect string. In addition to the database user name and password, a connect string includes a host name or host IP address, an optional TCP port number, and an optional database service name. These additional parameters are required to help Oracle Net find the right host computer and connect to Oracle Database XE. 

Was mich also stützig gemacht hat ist der Satz mit "a connect string includes a host name or host IP address"

Ich nehme an, gemeint ist:
host name ---> falls sich der Remote-Server(Rechner 1) und der Client(Rechner 1) in einem gemeinsamen Netzwerk befinden(gemeinsam über einem Router zum Beispiel).

host IP address ---> falls der Remote-Server ganz woanders(im Interet) ist.

Macht diese Annahme eigentlich Sinn?

sheel, mhhh.. was meintest Du mit "Um sicher zu gehen kann man ja, wie schon gesagt wurde, die IP 127.0.0.1 verwenden."?  Auf was bezieht sich diese Aussage? 

Schöne Grüße aus Rheinland,
Eure Ratna


----------



## sheel (2. Mai 2012)

oraclin25 hat gesagt.:


> danke für den Beitrag.  Es geht hier mehr darum, was zur Verbindung mit einem remote-Server im Feld HOST einzugeben ist.  Laut Dokumentation von Oracle:
> ...
> sheel, mhhh.. was meintest Du mit "Um sicher zu gehen kann man ja, wie schon gesagt wurde, die IP 127.0.0.1 verwenden."?  Auf was bezieht sich diese Aussage?


Hmm...eigentlich auf gar nichts 
Das kommt davon, wenn man um 4 Uhr morgens was schreibt 



oraclin25 hat gesagt.:


> Was mich also stützig gemacht hat ist der Satz mit "a connect string includes a host name or host IP address"
> 
> Ich nehme an, gemeint ist:
> host name ---> falls sich der Remote-Server(Rechner 1) und der Client(Rechner 1) in einem gemeinsamen Netzwerk befinden(gemeinsam über einem Router zum Beispiel).
> ...


Ja, aber eine Art von Hosts fehlt noch, die Urlform:
Sowas wie http://www.meinedatenbank.de oder google.com oder ...
Die sind zwar eher für Webseiten bekannt, können aber genausogut
(oder zusätzlich) eine Datenbank haben.

Also
a) Namen wie "Heim": Im globalen Internet unpraktikabel
b) Domains wie "google.com"
c) IP wie "78.44.123.99"

Technisch geht alles auf die IP;
die Namen gibts nur, damit man es sich besser merken kann.


----------

