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