sql >> Databasteknik >  >> RDS >> Database

Hur man fixar ORA-12505, TNS:listener känner för närvarande inte till SID som ges i anslutningsbeskrivningen

För att korrekt lösa det här felet och ansluta till lämplig Oracle-databas, måste vi förklara lite om hur Oracle beter sig och därför vad som orsakar det här problemet i första hand.

SID kontra SERVICE_NAMES

Det är viktigt att förstå den (lite) skillnaden mellan vad Oracle definierar som en SID jämfört med en SERVICE_NAME , eftersom vi kommer att använda denna information för att skapa en korrekt anslutningssträng senare.

I Oracle, systemidentifieraren (eller SID ) är en lokal identifierare på upp till åtta tecken lång som används för att identifiera en viss databas och skilja den från andra databaser i systemet.

Ofta SID är prefixordet eller DB_UNIQUE_NAME som föregår DB_DOMAIN . Till exempel, SID i vår bookstore databas, som visas i det fullständiga global database name av bookstore.company.com .

SERVICE_NAMES , å andra sidan representerar de namn som databasinstanser kan kopplas till. En SERVICE_NAME kommer vanligtvis att följa formatet för SID följt av databasdomänen, som så:DB_UNIQUE_NAME.DB_DOMAIN

TNS-lyssnaren

När en klient försöker ansluta till en Oracle-databas istället för att ansluta till databasen direkt , det finns en mäklartjänst som ingriper och hanterar anslutningsförfrågan för klienten.

Denna mäklarapplikation är känd som listener och den utför uppgiften att lyssna för inkommande kundförfrågningar. När en begäran tas emot, listener bearbetar och vidarebefordrar den begäran till lämplig Oracle-databasserver med hjälp av en service handler , som bara fungerar som kopplingen mellan listener och databasservern.

TNS-namn och konfiguration

När du ansluter till en Oracle-databas har din databasserver vanligtvis tnsnames.ora , som är en konfigurationsfil som informerar servern om NET_SERVICE_NAMES som är giltiga databasanslutningar. Som standard finns den här filen på ORACLE_HOME/network/admin .

Till exempel en NET_SERVICE_NAME beskrivning i tnsnames.ora kan formateras så här:

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

Detta skulle definiera en NET_SERVICE_NAME med SERVICE_NAME vi diskuterade tidigare (bookstore.company.com ) och ansluter till localhost genom port 1521 .

Anslutningssträng

Med lite mer kunskap om hur Oracle faktiskt ansluter till databaser kan vi nu titta på hur connection strings är formaterade.

Anslut via TNS-namn/NET_SERVICE_NAME

När du ansluter via en NET_SERVICE_NAME som anges i din tnsnames.ora config-filen måste du använda username , password , och lägg sedan till NET_SERVICE_NAME med @ symbol, som så:

username/password@NET_SERVICE_NAME

Alltså för vår tidigare NET_SERVICE_NAME beskrivningen ovan, den faktiska NET_SERVICE_NAME vi definierade var myDatabaseNetService , så vår anslutningssträng kan se ut ungefär så här:

john/Hunter2@myDatabaseNetService

Anslut via SERVICE_NAME

När du ansluter via en SERVICE_NAME måste du också lägga till host och port , tillsammans med / symbol före SERVICE_NAME själv:

username/password@host:port/SERVICE_NAME

Anslut via SID

Slutligen, om du ansluter utan en konfigurerad NET_SERVICE_NAME eller till och med SERVICE_NAME , kan du göra det direkt via SID genom att använda : symbol istället för / symbol som med SERVICE_NAME anslutningssträng:

username/password@host:port:SID

  1. Vilken datatyp ska användas för hashat lösenordsfält och vilken längd?

  2. Dynamisk kolumn i SELECT-sats postgres

  3. Saknade index i MS SQL eller optimering på nolltid

  4. Datamigreringar