sql >> Database >  >> RDS >> Database

Hoe ORA-12505 te repareren, TNS:luisteraar kent momenteel geen SID die is opgegeven in de connect-descriptor

Om deze fout correct op te lossen en verbinding te maken met de juiste Oracle-database, moeten we een beetje uitleggen hoe Oracle zich gedraagt ​​en dus wat dit probleem in de eerste plaats veroorzaakt.

SID's versus SERVICE_NAMES

Het is belangrijk om het (kleine) verschil te begrijpen tussen wat Oracle definieert als een SID vergeleken met een SERVICE_NAME , aangezien we deze informatie later zullen gebruiken om een ​​goede verbindingsreeks te maken.

In Oracle is de systeem-ID (of SID ) is een lokale identificatiecode van maximaal acht tekens die wordt gebruikt om een ​​bepaalde database te identificeren en te onderscheiden van andere databases op het systeem.

Vaak is de SID is het voorvoegsel woord of DB_UNIQUE_NAME die voorafgaat aan de DB_DOMAIN . Bijvoorbeeld de SID van onze bookstore database, zoals te zien in de volledige global database name van bookstore.company.com .

SERVICE_NAMES , aan de andere kant, vertegenwoordigen de namen waarmee database-instanties kunnen worden verbonden. Een SERVICE_NAME zal doorgaans het formaat van de SID . volgen gevolgd door het databasedomein, zoals:DB_UNIQUE_NAME.DB_DOMAIN

De TNS-luisteraar

Wanneer een client probeert verbinding te maken met een Oracle-database, in plaats van rechtstreeks met de database te verbinden , is er een makelaarsdienst die tussenbeide komt en het verbindingsverzoek voor de klant afhandelt.

Deze broker-applicatie staat bekend als de listener en het voert de taak uit van luisteren voor inkomende klantverzoeken. Wanneer een verzoek wordt ontvangen, zal de listener verwerkt en stuurt dat verzoek door naar de juiste Oracle-databaseserver met behulp van een service handler , die alleen fungeert als de verbinding tussen de listener en de databaseserver.

TNS-namen en configuratie

Wanneer u verbinding maakt met een Oracle-database, heeft uw databaseserver doorgaans tnsnames.ora , een configuratiebestand dat de server informeert over NET_SERVICE_NAMES die geldige databaseverbindingen zijn. Dit bestand bevindt zich standaard op ORACLE_HOME/network/admin .

Bijvoorbeeld een NET_SERVICE_NAME descriptor in tnsnames.ora kan als volgt worden opgemaakt:

myDatabaseNetService =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVICE_NAME = bookstore.company.com)
    )
  )

Dit zou een NET_SERVICE_NAME definiëren met behulp van de SERVICE_NAME we eerder hebben besproken (bookstore.company.com ) en verbinding maken met localhost via poort 1521 .

Verbindingsreeks

Met wat meer kennis over hoe Oracle daadwerkelijk verbinding maakt met databases, kunnen we nu bekijken hoe connection strings zijn geformatteerd.

Verbinden via TNS-naam/NET_SERVICE_NAME

Bij verbinding via een NET_SERVICE_NAME zoals gespecificeerd in uw tnsnames.ora config-bestand, moet u de username . gebruiken , password en voeg vervolgens de NET_SERVICE_NAME . toe met de @ symbool, zoals zo:

username/password@NET_SERVICE_NAME

Dus voor onze vorige NET_SERVICE_NAME descriptor hierboven, de werkelijke NET_SERVICE_NAME we gedefinieerd was myDatabaseNetService , dus onze verbindingsreeks kan er ongeveer zo uitzien:

john/Hunter2@myDatabaseNetService

Verbinden via SERVICE_NAME

Bij verbinding via een SERVICE_NAME , moet u ook de host . toevoegen en port , samen met de / symbool voorafgaand aan de SERVICE_NAME zelf:

username/password@host:port/SERVICE_NAME

Verbinden via SID

Tot slot, als verbinding wordt gemaakt zonder een geconfigureerde NET_SERVICE_NAME of zelfs SERVICE_NAME , kunt u dit rechtstreeks doen via de SID door de : . te gebruiken symbool in plaats van de / symbool zoals bij de SERVICE_NAME verbindingsreeks:

username/password@host:port:SID

  1. Gebruik van FLASHBACK in Oracle

  2. Wat betekent SQL Select-symbool || gemeen?

  3. Verbinding geweigerd (PGError) (postgresql en rails)

  4. Manieren om toegang te krijgen tot Oracle Database in PostgreSQL