1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

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

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von oraclin25, 30. April 2012.

  1. oraclin25

    oraclin25 Erfahrenes Mitglied

    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:p
  2. Michael Melchers

    Michael Melchers Grünschnabel

    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
  3. oraclin25

    oraclin25 Erfahrenes Mitglied

    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
  4. Michael Melchers

    Michael Melchers Grünschnabel

    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?
  5. oraclin25

    oraclin25 Erfahrenes Mitglied

    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.
  6. Michael Melchers

    Michael Melchers Grünschnabel

    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
  7. oraclin25

    oraclin25 Erfahrenes Mitglied

    Hallo Michael,

    super erklärt, dabei hast Du ja eigentlich dein Oracle unter Linux laufen. vielen lieben Dank.. Wenn ich so überlege :rolleyes:, 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 :p
  8. Thomas Darimont

    Thomas Darimont Administrator

    Hallo,

    zusätzlich zu der umfangreichen Erklärung von Michael Melchers wollte ich nur noch erwähnen, dass man sich über:
    Code (Text):
    1.  
    2. sqlplus "connectstring"
    3.  
    Z.Bsp:
    Code (Text):
    1.  
    2. [code]
    3. REM mit User "username" und Passwort "password" zur lokalen Instanz "InstanceName" verbinden (bzw. der Instanz die mit "InstanceName" in der tnsnames.ora beschrieben ist)
    4. sqlplus username/password@InstanceName
    5.  
    ...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
  9. oraclin25

    oraclin25 Erfahrenes Mitglied

    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
  10. Thomas Darimont

    Thomas Darimont Administrator

    Hallo,

    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.

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

    Gruß Tom
  11. oraclin25

    oraclin25 Erfahrenes Mitglied

    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?:rolleyes:
    Danke

    Schöne Grüße aus Rheinland,
    Eure Ratna:p
  12. oraclin25

    oraclin25 Erfahrenes Mitglied

    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
  13. Michael Melchers

    Michael Melchers Grünschnabel

    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
  14. oraclin25

    oraclin25 Erfahrenes Mitglied

    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?:rolleyes:

    Schöne Grüße aus Rheinland,
    Eure Ratna:p
  15. Michael Melchers

    Michael Melchers Grünschnabel

    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
  16. oraclin25

    oraclin25 Erfahrenes Mitglied

    Hallo Michael,

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

    Schöne Grüße,
    Eure Ratna
  17. Michael Melchers

    Michael Melchers Grünschnabel

    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
  18. oraclin25

    oraclin25 Erfahrenes Mitglied

    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
  19. oraclin25

    oraclin25 Erfahrenes Mitglied

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

    Michael Melchers Grünschnabel

    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

Diese Seite empfehlen