Database
 sql >> Datenbank >  >> RDS >> Database

Wie man ORA-12505 behebt, TNS:Listener kennt derzeit die im Verbindungsdeskriptor angegebene SID nicht

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