Um diesen Fehler richtig zu beheben und eine Verbindung zur entsprechenden Oracle-Datenbank herzustellen, müssen wir ein wenig erläutern, wie sich Oracle verhält und was dieses Problem daher überhaupt verursacht.
SIDs vs. SERVICE_NAMES
Es ist wichtig, den (kleinen) Unterschied zwischen dem, was Oracle als SID
definiert, zu verstehen im Vergleich zu einem SERVICE_NAME
, da wir diese Informationen später verwenden, um eine geeignete Verbindungszeichenfolge zu erstellen.
In Oracle ist die Systemkennung (oder SID
) ist eine lokale Kennung mit bis zu acht Zeichen Länge, die verwendet wird, um eine bestimmte Datenbank zu identifizieren und sie von anderen Datenbanken auf dem System zu unterscheiden.
Häufig die SID
ist das Präfixwort oder DB_UNIQUE_NAME
die vor DB_DOMAIN
steht . Zum Beispiel die SID
unserer bookstore
Datenbank, wie im vollständigen global database name
zu sehen von bookstore.company.com
.
SERVICE_NAMES
stellen dagegen die Namen dar, mit denen Datenbankinstanzen verbunden werden können. Ein SERVICE_NAME
folgt normalerweise dem Format der SID
gefolgt von der Datenbankdomäne, etwa so:DB_UNIQUE_NAME.DB_DOMAIN
Der TNS-Listener
Wenn ein Client versucht, sich mit einer Oracle-Datenbank zu verbinden, anstatt sich direkt mit der Datenbank zu verbinden , gibt es einen Broker-Dienst, der eingreift und die Verbindungsanfrage für den Client verarbeitet.
Diese Broker-Anwendung ist als listener
bekannt und es übernimmt die Aufgabe des Zuhörens für eingehende Kundenanfragen. Wenn eine Anfrage empfangen wird, der listener
verarbeitet und leitet diese Anfrage mithilfe eines service handler
an den entsprechenden Oracle-Datenbankserver weiter , die nur als Verbindung zwischen dem listener
fungiert und dem Datenbankserver.
TNS-Namen und -Konfiguration
Wenn Sie eine Verbindung zu einer Oracle-Datenbank herstellen, hat Ihr Datenbankserver normalerweise tnsnames.ora
, eine Konfigurationsdatei, die den Server über NET_SERVICE_NAMES
informiert die gültige Datenbankverbindungen sind. Standardmäßig befindet sich diese Datei unter ORACLE_HOME/network/admin
.
Zum Beispiel ein NET_SERVICE_NAME
Deskriptor in tnsnames.ora
kann wie folgt formatiert werden:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Dies würde einen NET_SERVICE_NAME
definieren mit dem SERVICE_NAME
wir bereits besprochen haben (bookstore.company.com
) und sich mit localhost
verbinden über Port 1521
.
Verbindungszeichenfolge
Mit etwas mehr Wissen darüber, wie Oracle tatsächlich eine Verbindung zu Datenbanken herstellt, können wir uns jetzt ansehen, wie connection strings
verwendet werden sind formatiert.
Über TNS-Name/NET_SERVICE_NAME verbinden
Beim Verbinden über NET_SERVICE_NAME
wie in Ihrer tnsnames.ora
angegeben config-Datei müssen Sie den username
verwenden , password
, und hängen Sie dann NET_SERVICE_NAME
an mit dem @
Symbol, etwa so:
username/password@NET_SERVICE_NAME
Also für unseren vorherigen NET_SERVICE_NAME
Deskriptor oben, der eigentliche NET_SERVICE_NAME
Wir haben myDatabaseNetService
definiert , unsere Verbindungszeichenfolge könnte also etwa so aussehen:
john/Hunter2@myDatabaseNetService
Über SERVICE_NAME verbinden
Beim Verbinden über einen SERVICE_NAME
, müssen Sie auch den host
hinzufügen und port
, zusammen mit /
Symbol vor dem SERVICE_NAME
selbst:
username/password@host:port/SERVICE_NAME
Über SID verbinden
Schließlich, wenn eine Verbindung ohne konfigurierten NET_SERVICE_NAME
hergestellt wird oder sogar SERVICE_NAME
, können Sie dies direkt über die SID
tun indem Sie den :
verwenden Symbol anstelle von /
Symbol wie beim SERVICE_NAME
Verbindungszeichenfolge:
username/password@host:port:SID