For at løse denne fejl korrekt og oprette forbindelse til den relevante Oracle-database, bliver vi nødt til at forklare lidt om, hvordan Oracle opfører sig og derfor, hvad der forårsager dette problem i første omgang.
SID'er vs. SERVICE_NAMES
Det er vigtigt at forstå den (lille) forskel mellem, hvad Oracle definerer som en SID
sammenlignet med en SERVICE_NAME
, da vi vil bruge disse oplysninger til at oprette en ordentlig forbindelsesstreng senere.
I Oracle, systemidentifikationen (eller SID
) er en lokal identifikator på op til otte tegn i længden, der bruges til at identificere en bestemt database og differentiere den fra andre databaser på systemet.
Ofte SID
er præfikset eller DB_UNIQUE_NAME
der går forud for DB_DOMAIN
. For eksempel SID
fra vores bookstore
database, som det ses i det fulde global database name
af bookstore.company.com
.
SERVICE_NAMES
, på den anden side repræsenterer de navne, som databaseinstanser kan forbindes med. En SERVICE_NAME
vil typisk følge formatet for SID
efterfulgt af databasedomænet, som sådan:DB_UNIQUE_NAME.DB_DOMAIN
TNS-lytteren
Når en klient forsøger at oprette forbindelse til en Oracle-database i stedet for at oprette forbindelse til databasen direkte , er der en mæglertjeneste, der griber ind og håndterer forbindelsesanmodningen for klienten.
Denne mæglerapplikation er kendt som listener
og den udfører opgaven at lytte for indkommende kundeønsker. Når en anmodning modtages, vil listener
behandler og videresender denne anmodning til den relevante Oracle-databaseserver ved hjælp af en service handler
, som bare fungerer som forbindelsen mellem listener
og databaseserveren.
TNS-navne og -konfiguration
Når du opretter forbindelse til en Oracle-database, vil din databaseserver typisk have tnsnames.ora
, som er en konfigurationsfil, der informerer serveren om NET_SERVICE_NAMES
som er gyldige databaseforbindelser. Som standard er denne fil placeret på ORACLE_HOME/network/admin
.
For eksempel en NET_SERVICE_NAME
deskriptor i tnsnames.ora
kan formateres som dette:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Dette ville definere en NET_SERVICE_NAME
ved hjælp af SERVICE_NAME
vi diskuterede tidligere (bookstore.company.com
) og opretter forbindelse til localhost
gennem port 1521
.
Forbindelsesstreng
Med lidt mere viden om, hvordan Oracle rent faktisk forbinder til databaser, kan vi nu se på, hvordan connection strings
er formateret.
Opret forbindelse via TNS-navn/NET_SERVICE_NAME
Når du opretter forbindelse via en NET_SERVICE_NAME
som angivet i din tnsnames.ora
config-fil, skal du bruge username
, password
, og tilføj derefter NET_SERVICE_NAME
med @
symbol, som sådan:
username/password@NET_SERVICE_NAME
Således for vores tidligere NET_SERVICE_NAME
beskrivelsen ovenfor, den faktiske NET_SERVICE_NAME
vi definerede var myDatabaseNetService
, så vores forbindelsesstreng kan se sådan ud:
john/Hunter2@myDatabaseNetService
Opret forbindelse via SERVICE_NAME
Når du opretter forbindelse via en SERVICE_NAME
, skal du også tilføje host
og port
, sammen med /
symbol foran SERVICE_NAME
selv:
username/password@host:port/SERVICE_NAME
Opret forbindelse via SID
Endelig, hvis du opretter forbindelse uden en konfigureret NET_SERVICE_NAME
eller endda SERVICE_NAME
, kan du gøre det direkte gennem SID
ved at bruge :
symbol i stedet for /
symbol som med SERVICE_NAME
forbindelsesstreng:
username/password@host:port:SID